【问题标题】:PowerShell: Start a process with unquoted argumentsPowerShell:使用不带引号的参数启动进程
【发布时间】:2014-02-25 15:32:23
【问题描述】:

我的 PowerShell 脚本应该使用指定的参数启动一个外部可执行文件。我有两个字符串:文件名和参数。这就是我通常想要的启动 API 的过程。然而,PowerShell 失败了。

我需要将可执行文件和参数保存在单独的字符串中,因为它们是在我的脚本中的其他位置配置的。这个问题只是关于使用这些字符串来启动这个过程。另外,我的脚本需要在可执行文件前面放置一个通用的基本路径。

这是代码:

$execFile = "SomeSetup.exe"
$params = "/norestart /verysilent"
& "$basePath\$execFile" $params | Out-Host
# Pipe to the console to wait for it to finish

这是实际结果(不适用于本程序):

  • 进程文件名:“C:\My\Base path\SomeSetup.exe”
  • 处理命令行:"/norestart /verysilent"

这是我所期望的(这可行):

  • 进程文件名:“C:\My\Base path\SomeSetup.exe”
  • 处理命令行:/norestart /verysilent

问题在于安装程序识别出额外的引号并将两个参数解释为一个 - 并且不理解它。

我见过Start-Process,但它似乎需要 string[] 中的每个参数,而我没有。拆分这些参数似乎是一项复杂的 shell 任务,而不是我会做的事情(可靠)。

我现在能做什么?我应该使用类似的东西

& cmd /c "$execFile $params"

但是如果 $execFile 包含很可能会发生的空格,并且通常会在您找到它之前引起更多的头痛。

【问题讨论】:

  • 尝试使用单引号而不是双引号。
  • 单引号是一样的。没用。

标签: powershell


【解决方案1】:

你可以把你的参数放在一个数组中:

$params = "/norestart", "/verysilent"
& $basepath\$execFile $params

【讨论】:

    【解决方案2】:

    当您从 Powershell 运行旧命令时,它必须将 powershell 变量转换为单个字符串,即旧命令行。

    • 程序名称始终用引号括起来。
    • 任何包含空格字符的参数都用双精度括起来 引号(这当然是你问题的根源)
    • 数组的每个元素构成一个单独的参数。

    所以给定:

    $params = "/norestart /verysilent"
    & "$basePath\$execFile" $params
    

    Powershell 将运行命令:

    "\somepath\SomeSetup.exe" "/norestart /verysilent"
    

    解决方案是将单独的参数存储在一个数组中:

    $params = "/norestart","/verysilent"
    & "$basePath\$execFile" $params
    

    将运行:

    "\somepath\SomeSetup.exe" /norestart /verysilent
    

    或者如果你已经有一个字符串:

    $params = "/norestart /verysilent"
    & "$basePath\$execFile" ($params -split ' ')
    

    也可以。

    【讨论】:

      【解决方案3】:
      $execFile = "SomeSetup.exe"
      $params = "/norestart /verysilent"
      Invoke-Expression ($basePath + "\" + $execFile + " " +$params)
      

      【讨论】:

      • 根据微软的说法,Invoke-Expression& 的别名。而且您缺少可执行文件名周围的引号。
      • 老板没有遗漏任何东西,我们正在动态创建一个字符串;)试试$execFile = "ipconfig"; $params = "/all"; Invoke-Expression ($execFile + " " +$params)
      • @LonelyPixel - Invoke-Expression 不是 & 的别名。 Invoke-Expression 大致是:将此字符串写入 ps1 文件,然后运行 ​​ps1 文件。 & 是调用运算符 - 它只是意味着 - 下一个值(通常是字符串或变量)命名要运行的命令。
      • 哦酷,德语翻译和英文页面不同:technet.microsoft.com/de-de/library/ee176880.aspx我明天试试这个。
      • 不是地球上最漂亮的代码,但被接受了,因为它是第一个也是唯一一个真正有效的答案。
      【解决方案4】:

      试试这个方法:

      & $execFile /norestart /verysilent
      

      比尔

      【讨论】:

      • 我需要从另一个配置部分传递参数,所以配置不够。
      【解决方案5】:

      只需使用单引号:

      $execFile = "SomeSetup.exe"
      $params = "/norestart /verysilent"
      & "'$basePath\$execFile' $params" | Out-Host
      # Pipe to the console to wait for it to finish
      

      另外我会使用 join-path 而不是连接两个字符串:

      $path = Join-Path $basePath $execFile
      & "$path $params" | out-host
      

      【讨论】:

      • 不起作用。它试图找到完整的字符串,包括。空间和参数作为命令并失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多