[英]How does the Count property work in Powershell?
我犯了一個最不幸的錯字,浪費了我一些寶貴的時間:
$errors.Count
從 PowerShell V3 開始,屬性 Count 和 Length 接受了與擴展類型數據(也稱為 ETS 或擴展類型系統)無關的非常特殊的處理。
如果實例具有 Count\/Length 屬性,那么一切都會像在 V1\/V2 中一樣繼續工作 - 返回來自實例的值。
如果實例沒有 Count\/Length 屬性,從 V3 開始,不是錯誤,您將返回 1。如果實例為 $null,您將返回 0。如果您已打開嚴格模式,你會得到一個類似 V2 的錯誤。
我承認這有點奇怪,但它解決了 cmdlet 返回 0、1 或多個對象時的常見問題。
通常,您將通過管道或使用 foreach 語句遍歷這些結果。 例如:
dir nosuchfile* | % { $_ }
foreach ($item in dir nosuchfile*) { $_ }
為了補充保羅的回答,這可能與擴展類型數據有關。 引用文檔的相關部分:
擴展類型數據定義 Windows PowerShell 中對象類型的其他屬性和方法(“成員”)。 您可以擴展 Windows PowerShell 支持的任何類型,並使用添加的屬性和方法,其方式與使用在對象類型上定義的屬性相同。
和:
Windows PowerShell 會話中有三個擴展類型數據源。 Windows PowerShell 安裝目錄中的 Types.ps1xml 文件會自動加載到每個 Windows PowerShell 會話中。
如果您打開該 Types.ps1xml 文件(在$pshome
中),您將在文件的開頭看到:
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>Length</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
所以我的猜測是,通過提供“ .Count
”屬性,PowerShell 假定這是一個數組。
這是我認為它的工作原理:
案例 1:在數組中 .Count 屬性實際上鏈接到
.Count<\/code>屬性,
.Length<\/code>屬性顯示數組中的項目數
案例 2:非存在變量由 powershell 自動創建並使用值
$null<\/code>初始化
案例 3 \/ 4:在這一點上,我不確定為什么會發生這種情況,但由於 String、Int 或布爾對象都沒有
.Count<\/code>屬性,我可以想象該屬性是由父對象繼承的。
該行為表明該變量被視為數組,因此分配了 1 個值的輸出將為 1,沒有值的結果將為 0。
編輯:為了完整起見,這里是文檔的鏈接: Technet<\/a> ,謝謝@David Brabant
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.