代码之家  ›  专栏  ›  技术社区  ›  Álvaro González

外部命令的语法

  •  0
  • Álvaro González  · 技术社区  · 8 年前

    我的脚本运行外部命令时没有任何问题:

    $Target= "X:\Backup 2017-12-27.7z"
    Write-Host "Compressing as $Target..."
    & "C:\Program Files\7-Zip\7z.exe" a "$Target" @C:\Webs\Scripts\include.txt -w
    

    但当我添加更多开关时,它完全崩溃了:

    $Target= "X:\Backup 2017-12-27.7z"
    Write-Host "Compressing as $Target..."
    & "C:\Program Files\7-Zip\7z.exe" a "$Target" -spf -i@C:\Webs\Scripts\include.txt -x@C:\Webs\Scripts\exclude.txt -w
    
    7z.exe : ERROR: X:\Backup 2017-12-27.7z
    At C:\Webs\Scripts\backup.ps1:50 char:1
    + & "C:\Program Files\7-Zip\7z.exe" a "$Target" -spf -i@C:\Webs\Scripts\include.t ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (ERROR: X:\Backup 2017-12-27.7z:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
    
    X:\Backup 2017-12-27.7z
    Open ERROR: Can not open the file as [7z] archive
    ERRORS:
    Headers Error
    System ERROR:
    Incorrect function.
    

    命令在以下位置运行良好 cmd . 我破坏了什么PowerShell语法,如何修复它?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Ansgar Wiechers    8 年前

    有时,PowerShell的参数解析会干扰要传递给外部程序的参数。这就是为什么您希望确保PowerShell将这些参数视为字符串,而不是它应该自己处理的参数。你可以在整个论点周围加引号:

    $program = 'C:\path\to\your.exe'
    & $program '-a' '-b:foo'
    

    和/或将参数放入变量中:

    $program = 'C:\path\to\your.exe'
    $param1  = '-a'
    $param2  = '-b:foo'
    & $program $param1 $param2
    

    更好的方法是收集数组中的所有参数 splat 程序上的数组:

    $program = 'C:\path\to\your.exe'
    $params  = '-a', '-b:foo'
    & $program @params
    

    从PowerShell v3开始,您还可以使用“magic参数”( --% )要防止PowerShell分析参数,请执行以下操作:

    $program = 'C:\path\to\your.exe'
    & $program --% -a -b:foo
    

    但请注意,PowerShell不会评估 --% ,这意味着所有内容(包括变量)都将作为文本传递。

    $program = 'C:\path\to\your.exe'
    & $program --% $foo
    

    在上面的代码段中,将使用文本字符串调用程序 '$foo' 而不是变量的值 $foo .

    有关从PowerShell运行外部命令的详细信息 see here .

        2
  •  0
  •   Álvaro González    8 年前

    问题是由中的空格引起的 $Target . 我不知道为什么这是一个问题,是否取决于其他交换机的存在。正如@TimTharratt所指出的,将文本移动到变量的解决方法对我来说很有效。注入的变量甚至不需要引用:

    $Target= "X:\Backup 2017-12-27.7z"
    Write-Host "Compressing as $Target..."
    $Include = "-i@C:\Webs\Scripts\include.txt"
    $Exclude = "-x@C:\Webs\Scripts\exclude.txt"
    & "C:\Program Files\7-Zip\7z.exe" a $Target -spf $Include $Exclude -w
    

    我很乐意接受任何提供了适当修复或(如果没有完整的CS专业也可能)解释PowerShell有关空格的语法的答案。同时,这里有一个解决方法。

    推荐文章