2015-10-28 41 views
0

我有一個powershell腳本的一部分,檢查位置和驗證文件的計數,然後根據計數運行檢查。 powershell腳本運行在多臺機器上,其中一臺運行powershell 2.0。.count在多個PowerShell版本

我使用的是一樣的東西:

$folder = Get-Item "Parent Folder" 
$files = (Get-ChildItem $folder.Fullname) 

當我檢查$files.Count它會在PowerShell中大於2.0的版本準確。 在Powershell 2.0中,如果$files只包含1個文件,則files.Count不會返回任何內容。如果有多個文件,則它返回正確的數量(非空)。

我假設這與$files不是一個數組,如果Get-ChildItem只返回一個值。

我知道檢查PowerShell版本並修改每個版本的腳本將解決此問題,但我寧願避免它。

有沒有其他方法可以在多個版本的PowerShell中統一檢查計數?

回答

4

這是一個已知的問題,您必須將PS 2.0的返回值轉換爲數組。它被固定在PS 3.0:

您現在可以使用任何對象計數或長度,即使沒有 財產吧。如果該對象沒有Count或Length屬性,則它將返回1(或0爲$ null)。具有Count或 長度屬性的對象將像以往一樣繼續工作。

實施例:

$files = @(Get-ChildItem $folder.Fullname) 

[array]$files = Get-ChildItem $folder.Fullname 

參考文獻:

+2

恕我直言,不使用轉換''[數組]'。它在空管道的情況下不會返回空數組。如果管道返回單個元素並且該單個元素是集合,那麼轉換爲'[array]'將把集合的元素複製到數組,而不是像'@()'那樣將元素包裝到單個元素數組中。 – PetSerAl

+0

@PetSerAl同意,謝謝澄清。有時''[array]'行爲更可取,因爲如果返回值爲空,它將包含'$ null',可以使用比較運算符輕鬆地進行比較。對於空數組來說並不那麼簡單,因爲當用於數組時,[比較運算符不會返回布爾值($ true或$ false)。他們返回符合條件的數組的所有成員。](http://stackoverflow.com/a/29614241/4424236) – beatcracker

+0

如果數組爲空,則可以比較'$ array.Count -eq 0'或'不是$ array.Count'。 – PetSerAl