我想运行一个外部进程,并将它的命令输出捕获到PowerShell中的一个变量。我目前正在使用这个:

$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait

我已经确认该命令正在执行,但我需要将输出捕获到一个变量中。这意味着我不能使用-RedirectOutput,因为它只重定向到一个文件。


当前回答

如果你想重定向错误输出,你必须做:

$cmdOutput = command 2>&1

或者,如果程序名中有空格:

$cmdOutput = & "command with spaces" 2>&1

其他回答

另一个现实生活中的例子:

$result = & "$env:cust_tls_store\Tools\WDK\x64\devcon.exe" enable $strHwid 2>&1 | Out-String

注意,这个示例包括一个路径(以一个环境变量开始)。注意,引号必须包含路径和EXE文件,而不是参数!

注意:不要忘记在命令前面,但在引号之外的&字符。

错误输出也会被收集。

我花了一段时间来让这个组合工作,所以我想我会分享它。

或者试试这个。它将输出捕获到变量$scriptOutput:

& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null

$scriptOutput

对我来说,当使用外部命令时,当标准错误和标准输出流都可能是运行命令(或它们的混合)的结果时,我的诀窍是:

$output = (command 2>&1)

这招对我很管用:

$scriptOutput = (cmd /s /c $FilePath $ArgumentList)

我使用以下方法:

Function GetProgramOutput([string]$exe, [string]$arguments)
{
    $process = New-Object -TypeName System.Diagnostics.Process
    $process.StartInfo.FileName = $exe
    $process.StartInfo.Arguments = $arguments
    
    $process.StartInfo.UseShellExecute = $false
    $process.StartInfo.RedirectStandardOutput = $true
    $process.StartInfo.RedirectStandardError = $true
    $process.Start()
    
    $output = $process.StandardOutput.ReadToEnd()   
    $err = $process.StandardError.ReadToEnd()
    
    $process.WaitForExit()
    
    $output
    $err
}
    
$exe = "C:\Program Files\7-Zip\7z.exe"
$arguments = "i"
    
$runResult = (GetProgramOutput $exe $arguments)
$stdout = $runResult[-2]
$stderr = $runResult[-1]
    
[System.Console]::WriteLine("Standard out: " + $stdout)
[System.Console]::WriteLine("Standard error: " + $stderr)