我可以直觀地找出大多數語言,但顯然不是Powershell。Powershell - 如何聲明一個數組以供與+ =運算符一起使用
我想創建一個數組數組(這將包含磁盤目錄和一個計數,以便我可以驗證我們至少有那麼多文件)。
從該數組數組中,我想拉出一個只包含目錄名稱的單個數組,以便將它傳遞給Get-ChildItem。
$DirInfo = @('d:\Work',2),
('d:\Temp',3)
[email protected]() #declare empty array
foreach ($item in $DirInfo)
{
$DirNameArray += , $item[0] #tried with and without the comma here
Write-Host 'Loop1 ' $item[0]
}
write-host $DirNameArray.count
#Let's Verify what we got so we know how many items we have in our array
Write-Host "Verify with a loop"
foreach ($dir in $DirNameArray)
{
Write-Host 'Loop2:' $dir
}
Write-Host "Verify the other way"
Write-Host $DirNameArray
實際結果:
Loop1 d:\Work
Loop1 d:\Temp
1
Verify with a loop
Loop2: d:\Workd:\Temp
Verify the other way
d:\Workd:\Temp
我不明白的是爲什麼環2沒有執行兩次。 它看起來像= +只是串在一起的價值,而不是添加一個新的項目,我的數組名爲$ DirNameArray。
我仍然完全莫名其妙,一個文件我創建做到這一點,並給了我預期的結果:
$a = "one","two"
Write-Host $a.count
$a += "three"
Write-Host $a.count
結果:
2
3
因此,如果上述措施都不起作用,爲什麼沒有我的代碼工作?
我創建的第二個文件執行此操作 - 我不理解結果。我甚至由不同的變量名,所以我不會被處理該變量先前的任何定義或值:
$DirNameArray5="abc","def"
write-host $DirNameArray5.count
$DirNameArray5 += "xyz"
write-host $DirNameArray5.count
$DirNameArray5 += @("opq")
write-host $DirNameArray5.count
結果:
1
1
1
$DirNameArray7="abc","def"
write-host $DirNameArray7.count
$DirNameArray7 += "xyz"
write-host $DirNameArray7.count
$DirNameArray7 += @("opq")
write-host $DirNameArray7.count
結果:
2
3
4
所以顯然,如果您曾經將變量定義爲字符串,那麼很難讓Powershell將其重新定義爲數組。
但我仍然有我的原始問題。如何定義一個空數組,以便我可以使用+ =運算符在循環中添加它。
[email protected]()
我終於用.GetType()方法來看看我的變量實際上是: PS C:\用戶\ nwalters> $ DirNameArray5.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\Users\nwalters> $DirNameArray7.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
底線 - 這就是我想做的事 - 在代碼幾行可能沒有循環:
[string][email protected]() # declare empty array
Write-Host $x.GetType()
$x += "one"
$x += "two"
Write-Host $x.count
Write-Host $x
實際結果
System.String
1
onetwo
期望的結果:
object[] or string[]???
2
one two
此代碼爲我工作(在PowerShell中2)。嘗試在循環之間添加一個'write-host $ DirNameArray.count'行。如果$ DirNameArray是一個數組,那麼Count屬性將顯示元素的數量。 – andyb
不知道這是否與PowerShell的'扁平化'陣列的習慣有關(我的猜測不會),但如果是這樣的話,這個前往資源似乎是Keith Hill的博客文章http://rkeithhill.wordpress.com/ 2007/09/24/effective-powershell-item-8-output-cardinality-scalars-collections-and-empty-sets-oh-my/ – andyb
andyb thecount shows 1,這是進一步的證明,它不會添加到我的數組,但只是將字符串數據添加到字符串的末尾。我讀博客,不確定我有什麼幫助。 – NealWalters