PowerShell:使用不带引号的参数启动进程

时间:2014-02-25 15:32:23

标签: powershell

我的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但似乎需要字符串[]中的每个参数,我没有。分裂这些参数似乎是一个复杂的shell任务,而不是我做的(可靠的)。

我现在该怎么办?我应该使用像

这样的东西吗?
& cmd /c "$execFile $params"

但是如果$ execFile包含很多可能发生的空间并且在找到它之前通常会引起更多的麻烦。

5 个答案:

答案 0 :(得分:2)

您可以将参数放在数组中:

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

答案 1 :(得分:2)

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

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

所以给出:

$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 ' ')

也可以。

答案 2 :(得分:0)

以这种方式尝试:

& $execFile /norestart /verysilent

比尔

答案 3 :(得分:0)

$execFile = "SomeSetup.exe"
$params = "/norestart /verysilent"
Invoke-Expression ($basePath + "\" + $execFile + " " +$params)

答案 4 :(得分:0)

只需使用单引号:

$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