【问题标题】:Execute a console application from PowerShell从 PowerShell 执行控制台应用程序
【发布时间】:2014-06-20 08:21:19
【问题描述】:

在本身是控制台应用程序的 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 中还有其他解决方案吗?

【问题讨论】:

  • 好的,今天给了我正确的返回码。仍然存在控制台重定向问题。我没有得到任何彩色输出,并且执行的进程无法确定其控制台窗口大小或移动光标。

标签: powershell


【解决方案1】:

您使用调用运算符 & 的想法是正确的 - 但您需要将参数作为数组而不是单个值传递。

当参数是单个值时,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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多