如何在PowerShell脚本中创建临时路径?

zengzsys  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(194)

给定下面的代码,我如何设置一个变量,我可以用来调用7z可执行文件?顶部的env:Path方法只工作一次,但之后必须重新加载终端,否则找不到命令。PowerShell似乎将其视为字符串,而不是可执行调用。最终,我需要能够从环境中提取这种价值。

# $env:Path += "C:\Program Files\7-Zip"
# works once, then the terminal must be reloaded

$7zip = "C:\Program Files\7-Zip\7z.exe"
$dirAsStr = "C:\Program Files\7-Zip\7z.exe"
$dirAsDir = Get-Item $dirAsStr

$extract_files = "somewhere"
$output = "someplace"

# $dirAsDir a -t7z $output\format_files.7z $extract_files\format.*
# ParserError: Unexpected token 'a' in expression or statement.
# $7zip a -t7z $output\format_files.7z $extract_files\format.*
# ParserError: Unexpected token 'a' in expression or statement.

C:\"Program Files"\7-Zip\7z.exe a -t7z $output\format_files.7z $extract_files\format.*
# works fine
abithluo

abithluo1#

$env:Path += "C:\Program Files\7-Zip"
应该是$env:Path += ";C:\Program Files\7-Zip"(注意;),并且它只对当前会话(进程)的剩余部分有效。
也就是说,您可以在同一个会话中以7z ...的身份调用7-Zip。
如果您希望此修改 * 持久化 *,即供今后各届会议使用:

  • 将命令放在$PROFILE文件中。
  • 或者:修改注册表中Path环境变量的持久化定义,例如:通过sysdm.cpl交互
  • 注意:不幸的是,* 健壮地 * 以编程方式 * 更新Path并不简单-请参阅this answer
$7zip a -t7z...

为了执行其名称或路径存储在变量 * 中的命令,您必须通过&**调用它们,调用操作符(这是PowerShell中的 * 语法必要性 *):

& $7zip a -t7z ...

同样的也适用于命令名或路径被引为一个整体 *:

  • C:\"Program Files"\7-Zip\7z.exe碰巧在没有 * &的情况下也能工作,因为参数 * 以 * 一个 * 未加引号的 * 字符串开头。
  • 顺便说一句:从一个 quoted 字符串开始并追加一个 unquoted 字符串在PowerShell中基本上不受支持;例如,在一个实施例中,

& "C:\Program Files\"7-Zip\7z.exe不起作用,因为7-Zip\7z.exe部分将成为 * 单独的参数 * -参见this answer

  • 相比之下,"C:\Program Files"\7-Zip\7z.exe" * 需要&

相比之下,&的使用是 * 可选的 *,带有 * 逐字的、不加引号的 * 命令名和路径(例如,7zC:\tools\7z.exe
详情请参见this answer

piztneat

piztneat2#

请试试这个:

Invoke-Expression "& `"$7zip`" a -t7z $output\format_files.7z $extract_files\format.*"

相关问题