【问题标题】:Powershell variable expansion when calling other programs调用其他程序时的Powershell变量扩展
【发布时间】:2012-05-07 14:34:59
【问题描述】:

我在尝试使用 7za 解压缩文件时遇到了一个小问题 Powershell 中的命令行实用程序。

我将 $zip_source 变量设置为 zip 文件的路径和 $unzip_destination 到所需的输出文件夹。

但是7za 的命令行使用需要像这样指定的参数:

7za x -y <zip_file> -o<output_directory>

所以我当前的通话看起来像这样:

& '7za' x -y "$zip_source" -o$unzip_destination

由于-o和目的地之间不能有空格 似乎PowerShell不会扩展$unzip_destination变量,而$zip_source是扩展的。

目前程序只是将所有文件提取到C:\的根目录中 一个名为$unzip_destination 的文件夹。 在变量周围设置不同类型的引号也不起作用:

-o"$unzip_destination" : still extracts to C:\$unzip_destination
-o'$unzip_destination' : still extracts to C:\$unzip_destination
-o $unzip_destination  : Error: Incorrect command line

有什么方法可以在运行命令之前强制展开?

【问题讨论】:

    标签: powershell variable-expansion


    【解决方案1】:

    试试这个:

    & '7za' x -y "$zip_source" "-o$unzip_destination" 
    

    【讨论】:

    • 效果也不错——我想我应该继续尝试引用。
    【解决方案2】:

    试试这样:

    -o $($unzip_destination)
    

    编者注:此解决方案仅适用于 -o 之后的空格(在这种情况下,只需 -o $unzip_destination 即可) - 如果您删除它,该命令将不起作用符合预期。
    因此,这种方法不适合按照 OP 的要求将变量值直接附加到选项名称。

    【讨论】:

    • -o 和 unzip_destination 之间不能有空格
    • 当我在 -o 后遗漏空格时 - 谢谢。 $() 是否在 PowerShell 中启动某种子 shell(抱歉,我是 Unix 背景下的 Windows 脚本新手)。
    • $() 被称为子表达式,它使括号内的所有内容都作为一个值返回: $("Hello, " + "world!") 字面意思是:Hello, world!当希望将某个表达式的输出转换为另一个字符串中间的字符串时,这些很有用。
    • 删除空格不起作用 - 除非您将整个参数包含在"..." 中,但您可以使用 jonZ 更简单的答案。很好的提示,@SpellingD;值得补充的是,为了稳健性,$(...) 作为字符串的一部分应始终与显式双引号一起使用,因为使用未引用的标记它并不总是有效 - 就像这里的情况一样,因为标记开始与-;见github.com/PowerShell/PowerShell/issues/6467
    【解决方案3】:

    这应该可行:

    & '7za' x -y $zip_source -o${unzip_destination} 
    

    【讨论】:

    • 也许令人惊讶的是,这只有在令牌不以 - 开头时才有效。
    猜你喜欢
    • 2018-09-24
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多