我的PowerShell脚本应该使用指定的参数启动外部可执行文件。我有两个字符串:文件名和参数。这是启动API通常需要的过程。然而,PowerShell失败了。
我需要将可执行文件和参数保存在单独的字符串中,因为这些是在我的脚本中的其他地方配置的。这个问题就是使用这些字符串来启动这个过程。此外,我的脚本需要在可执行文件前放置一个公共基本路径。
这是代码:
$execFile = "SomeSetup.exe"
$params = "/norestart /verysilent"
& "$basePath\$execFile" $params | Out-Host
# Pipe to the console to wait for it to finish
这是实际结果(不适用于此程序):
这是我期望的(这会起作用):
问题是设置识别了额外的引号并将两个参数解释为一个 - 并且不理解它。
我见过Start-Process
但似乎需要字符串[]中的每个参数,我没有。分裂这些参数似乎是一个复杂的shell任务,而不是我做的(可靠的)。
我现在该怎么办?我应该使用像
这样的东西吗?& cmd /c "$execFile $params"
但是如果$ execFile包含很多可能发生的空间并且在找到它之前通常会引起更多的麻烦。
答案 0 :(得分:2)
您可以将参数放在数组中:
$params = "/norestart", "/verysilent"
& $basepath\$execFile $params
答案 1 :(得分: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 ' ')
也可以。
答案 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