我想調用一個任意表達式並將std錯誤重定向到一個變量而不重定向到一個文件。Powershell將std錯誤重定向到變量
例如,在PowerShell中,可以重定向標準錯誤using 2> operator。使用臨時文件,我可以很容易地得到我想要的:
#$expr = "1/0" # with std error
#$expr = "2+2" # without stderror
#$expr = "Get-Service invalidsvc" # with stderror
$expr = "try { throw '111' } catch { }" # without std error
$ans = Invoke-Expression $expr -ErrorVariable ev 2> C:\log\stderr.txt
if(cat C:\log\stderr){
Write-Host "Error $ev"
}
我怎麼可以這樣做,但沒有建立時間輸出的文件?
錯誤的解決方案:
- 使用-ErrorVariable開關。計數器例如:
Invoke-Expression $expr -ErrorVariable ev 2> C:\aaa\file1.txt
$expr = "try { throw '111' } catch { }"
Write-Host "Error $ev" # will output error, but std error is empty
$ LASTEXITCODE和$?檢查。反例:
獲取-服務invalidservice
當我寫「嘗試{拋出‘111’}趕上{}」在PowerShell控制檯會出現在PS主機沒有紅色(錯誤),文本(儘管$誤差不爲空) 。所以如果我在我的代碼中調用這個表達式,我不會在某個變量中保存錯誤。當我編寫「Get-Service notexistingservice」,或「1/0」或「Write-Error 111」時,會出現紅色(錯誤)文本和非空$錯誤。因此,如果我在我的代碼中調用該表達式,我想將錯誤保存在某個變量中。
$ lastexitcode等於0,$?等於True,但std錯誤不爲空
UPD:有人能解釋爲什麼它被低估?我需要創建更明確的解釋嗎?
UPD2:想法很簡單:將Powershell控制檯中的「紅色」(std error)文本保存在變量中。我收到的命令是一個任意字符串。 例子:
我更新了帖子的內容,使事情輪。當然,你的代碼可以工作,但不能用於任意表達,即我沒有關於我執行的表達式的信息。 – 2xMax
換句話說,我如何區分「嘗試{拋111;}抓{}」和簡單地「扔111」?它們都有非空的$ error變量。我唯一可以使用的是$ ?,但它不適用於「Get-service aaaa」。 – 2xMax