无.ps1扩展名PowerShell脚本执行及输出捕获至变量方法
捕获PowerShell脚本的STDOUT和STDERR到变量(无屏幕输出)
针对你执行无.ps1扩展名脚本的场景,以下两种方式可以实现将输出捕获到变量且不输出到屏幕:
1. 将STDOUT和STDERR合并到同一个变量
使用PowerShell的重定向操作符*>&1,把所有输出流(包括正常输出、错误输出,甚至Write-Host的信息输出)合并到成功流,直接赋值给变量即可:
$allOutput = Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Get-Content path\script.txt))) *>&1
后续如果需要区分输出类型,可以通过对象类型筛选:
- 筛选错误记录:
$errors = $allOutput | Where-Object { $_ -is [System.Management.Automation.ErrorRecord] } - 筛选正常输出:
$normalOutput = $allOutput | Where-Object { $_ -isnot [System.Management.Automation.ErrorRecord] }
2. 将STDOUT和STDERR分别存到两个变量
利用Invoke-Command的-ErrorVariable参数,直接将错误输出捕获到指定变量,正常输出则赋值给另一个变量:
$stdOut = Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Get-Content path\script.txt))) -ErrorVariable stdErr
注意:-ErrorVariable后面的变量名不需要加$符号,执行后:
$stdOut存储脚本的正常输出(STDOUT)$stdErr存储脚本的错误输出(STDERR)
如果脚本中存在Write-Host输出,上述方式无法捕获这类信息流输出,若需要同时捕获,需结合重定向操作符6>&1将信息流合并到成功流,再进行拆分:
$combinedOutput = Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Get-Content path\script.txt))) *>&1 $stdOut = $combinedOutput | Where-Object { $_ -isnot [System.Management.Automation.ErrorRecord] -and $_ -isnot [System.Management.Automation.InformationRecord] } $stdErr = $combinedOutput | Where-Object { $_ -is [System.Management.Automation.ErrorRecord] } $writeHostOutput = $combinedOutput | Where-Object { $_ -is [System.Management.Automation.InformationRecord] }
内容的提问来源于stack exchange,提问作者Ωmega
相关产品推荐
相关产品推荐

