PS> gci C:\
<<here it doesn't print the value of $? as 'true' after command executes>
PS> $?
true
但是,當我嘗試使用自己的 powershell 函式重新創建此行為時,我得到:
PS> function test1 { write-host "hello"; return $true}
PS> test1
hello
true
PS> $?
true
是什么賦予了?為什么我不能從管道中隱藏函式的回傳值,而只將它寫入 $?多變的?
uj5u.com熱心網友回復:
這是 PowerShell 中眾多自動變數之一,您可以通過運行以下命令查看完整串列:
get-help about_Automatic_Variables
的作用$?是查看最后一條命令是否運行完成或遇到未捕獲的錯誤。
例如
function Throw-WhenOdd($value){
if ($value % 2 -ne 0){
throw "OddNumber"
}
}
PS> Throw-WhenOdd 4
PS> $?
True
PS> Throw-WhenOdd 3
Exception:
Line |
3 | throw "OddNumber"
| ~~~~~~~~~~~~~~~~~
| OddNumber
PS>$?
False
PS> #Checking the value of `$?` resets the value
# so checking a second time returns true
PS> $?
true
總而言之,如果您有一個函式或 cmdlet 或任何可以拋出的函式,您可以使用$?它來查看它是否拋出。但是,您必須使用 Throw 而不是 Write-Error 并且第一次檢查時會消耗輸出$?。
uj5u.com熱心網友回復:
首先,澄清一下:
在 PowerShell 中,
return- 如果給定一個引數 -將該引數輸出到成功輸出流,即它回傳資料- 就像隱式輸出或輸出Write-Output(很少需要使用)一樣。- 另請注意,
Write-Host它不是為輸出資料而設計的- 它是為直接到主機(控制臺)輸出而設計的 - 請參閱此答案。
- 另請注意,
相比之下,在 POSIX 兼容的 shell 中,例如
bash,return是函式級別的模擬,exit并設定了一個不可見的退出代碼。PowerShell
$?是一個抽象的錯誤條件指示符($true如果沒有發生錯誤,$false否則),它由 PowerShell 本身自動設定以指示最近執行的命令或運算式是否遇到錯誤條件 - 請參閱下面的詳細資訊。
由于PowerShell的7.2的,你不能設定的自動
$?變數; 它由 PowerShell 本身設定- 有關詳細資訊,請參閱底部部分。- GitHub 問題 #10917 中
$?已經認識到并批準了對直接設定能力的需求,但尚未實施。
- GitHub 問題 #10917 中
您只能間接設定它:
通過退出代碼,這僅適用于外部程式(行程退出代碼) 腳本檔案(
*.ps1) ,如果他們與終止exit宣告。- 最近報告的退出代碼(也反映在自動
$LASTEXITCODE變數中)映射到$?報告$true(如果是0)以及$false任何非零值。
- 最近報告的退出代碼(也反映在自動
對于cmdlet和函式,通過輸出到 PowerShell 的錯誤流:
對于二進制 cmdlet,發出至少一個非終止錯誤或一個陳述句終止錯誤會導致
$?反射$false由于PowerShell的7.2的,(根據定義寫入的-PowerShell中)功能只會影響
$?,如果他們先進的功能和使用笨重的$PSCmdlet.WriteError()(對于非終止錯誤)$PSCmdlet.ThrowTerminatingError()(對于宣告終止錯誤)的方法:Write-Error(對于非終止錯誤),不幸的是,并沒有影響$?-見GitHub的問題#3629雖然
throw宣告-如所示FoxDeploy的答案-并最終設定$?到$false,它會生成一個腳本-terminating(運行空間,終止)錯誤,這需要呼叫者明確地捕捉錯誤,與try / catch和$?然后必須在開始時查詢該catch塊。
值得注意的是,上述意思是:
- 獲取
$?反映$false總是需要產生錯誤輸出。 $?being$false只是告訴你發生了一些錯誤——它不是一個明確的意圖來表示命令作為一個整體的成功與失敗。
- 獲取
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393508.html
標籤:电源外壳
