我想运行一个外部进程,并将它的命令输出捕获到PowerShell中的一个变量。我目前正在使用这个:
$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait
我已经确认该命令正在执行,但我需要将输出捕获到一个变量中。这意味着我不能使用-RedirectOutput,因为它只重定向到一个文件。
我想运行一个外部进程,并将它的命令输出捕获到PowerShell中的一个变量。我目前正在使用这个:
$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait
我已经确认该命令正在执行,但我需要将输出捕获到一个变量中。这意味着我不能使用-RedirectOutput,因为它只重定向到一个文件。
当前回答
如果您所要做的只是捕获命令的输出,那么这将工作得很好。
我使用它来更改系统时间,因为[timezoneinfo]::local总是产生相同的信息,即使在您对系统进行了更改之后。这是我可以验证和记录时区更改的唯一方法:
$NewTime = (powershell.exe -command [timezoneinfo]::local)
$NewTime | Tee-Object -FilePath $strLFpath\$strLFName -Append
这意味着我必须打开一个新的PowerShell会话来重新加载系统变量。
其他回答
你有没有试过:
$OutputVariable = (Shell命令)| Out-String
如果您所要做的只是捕获命令的输出,那么这将工作得很好。
我使用它来更改系统时间,因为[timezoneinfo]::local总是产生相同的信息,即使在您对系统进行了更改之后。这是我可以验证和记录时区更改的唯一方法:
$NewTime = (powershell.exe -command [timezoneinfo]::local)
$NewTime | Tee-Object -FilePath $strLFpath\$strLFName -Append
这意味着我必须打开一个新的PowerShell会话来重新加载系统变量。
我尝试了答案,但在我的情况下,我没有得到原始输出。相反,它被转换为一个PowerShell异常。
我得到的原始结果是:
$rawOutput = (cmd /c <command> 2`>`&1)
如果你想重定向错误输出,你必须做:
$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文件,而不是参数!
注意:不要忘记在命令前面,但在引号之外的&字符。
错误输出也会被收集。
我花了一段时间来让这个组合工作,所以我想我会分享它。