2014-03-26 27 views
0

我可以直觀地找出大多數語言,但顯然不是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 
+0

此代碼爲我工作(在PowerShell中2)。嘗試在循環之間添加一個'write-host $ DirNameArray.count'行。如果$ DirNameArray是一個數組,那麼Count屬性將顯示元素的數量。 – andyb

+0

不知道這是否與PowerShell的'扁平化'陣列的習慣有關(我的猜測不會),但如果是這樣的話,這個前往資源似乎是Keith Hill的博客文章http://rkeithhill.wordpress.com/ 2007/09/24/effective-powershell-item-8-output-cardinality-scalars-collections-and-empty-sets-oh-my/ – andyb

+0

andyb thecount shows 1,這是進一步的證明,它不會添加到我的數組,但只是將字符串數據添加到字符串的末尾。我讀博客,不確定我有什麼幫助。 – NealWalters

回答

1

下面的代碼在兩個不同的計算機進行測試,無論使用PowerShell 2.0。你可以試試這個併發布結果。

 
# declare an empty array 
$var = @() 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# add a single item 
$var += "single item" 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# add an array 
$var += , @("array 1 - item 1","array 1 - item 2") 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# display the 'single item' 
write-host "single item = '$($var[0])'" 

# display first element of array item 
write-host "first element of array item = '$($var[1][0])'"

給我

 
var.count = '0' var.type ='System.Object[]' var.type.BaseType = 'array' 
var.count = '1' var.type ='System.Object[]' var.type.BaseType = 'array' 
var.count = '2' var.type ='System.Object[]' var.type.BaseType = 'array' 
single item = 'single item' 
first element of array item = 'array 1 - item 1'
+0

謝謝。我對兩件事感到困惑:1)[string] $ x = @()和$ x = @()之間有什麼區別,2)我的DirNameArray程序今天運行良好,但昨天失敗。我不知道爲什麼。我仍然認爲我必須在內存中有一些舊的變量沒有被正確清除。 – NealWalters

+0

您可以通過如下的'remove-varable VarName'來重置一個變量,例如'刪除變量DirNameArray'。爲了證明var不見了,使用'get-variable(varname)'。 – andyb

+0

您是否嘗試過我發佈的代碼?如果是這樣,你的結果和我一樣嗎? – andyb

相關問題