在PowerShell脚本本身就是一个控制台应用程序,我需要执行另一个具有任意名称,参数,没有流重定向的控制台应用程序,并获得正确的返回码。
这是我目前的代码:
$execFile = "C:\Path\To\Some.exe"
$params = "arg1 arg2 /opt3 /opt4"
# Wait until the started process has finished
Invoke-Expression ($execFile + " " + $params + " | Out-Host")
if (-not $?)
{
# Show error message
}
它可以使用正确的参数启动Win32应用程序(空格分隔参数,而不是所有内容都进入argv [1])。但返回代码似乎丢失了,它还重定向控制台流。那是行不通的。
另一个代码也错了:
& $execFile $params
if (-not $?)
{
# Show error message
}
虽然这会获得返回代码并等待进程完成,但它会将所有参数放入argv [1],并且执行的进程无法使用该垃圾输入。
PowerShell中还有其他解决方案吗?
答案 0 :(得分:2)
您使用调用运算符& - 但是你需要将参数作为数组而不是单个值传递。
当参数是单个值时,PowerShell假定您希望将该值作为单个值传递 - 有时这意味着在构建命令行时添加引号。此行为是预期的,因为它匹配将字符串传递给PowerShell命令,例如如果你尝试过:
$path = "C:\Program Files"
dir $path
您希望将单个值传递给dir,而不是多个值。
如果参数是一个数组,PowerShell将在构建命令行以传递给exe时在每个数组元素之间放置空格。
尝试:
$execFile = "C:\Path\To\Some.exe"
$params = "arg1","arg2","/opt3","/opt4"
# Wait until the started process has finished
& $execFile $params
if (-not $?)
{
# Show error message
}