2016-08-24 34 views
2

代碼示例:爲什麼單個元素散列表在PowerShell中表現不同?

function ToArray([hashtable] $hashTable){ 
    $ret = @() 
    foreach($key in $hashTable.Keys){ 
     $ret += ("`"" + $key + ":" + $hashTable[$key] + "`"") 
    } 
    $ret 
} 


$h1 = @{ 
    key1 = "value1" # Only one key in this one 
} 

$h2 = @{ 
    key2 = "value2" 
    key3 = "value3" 
} 

$h3 = @{ 
    key4 = "value4" 
    key5 = "value5" 
} 


$test1 = ToArray $h1 
$test1 += ToArray $h3 

$test2 = ToArray $h2 
$test2 += ToArray $h3 

Write-Host 
Write-Host "TEST 1:" $test1 
Write-Host "TEST 2:" $test2 

輸出:

TEST 1: "key1:value1""key5:value5" "key4:value4" 
TEST 2: "key3:value3" "key2:value2" "key5:value5" "key4:value4" 

問:爲什麼 中有TEST 1缺少空間?

PS Y:\> $test1.GetType() 
PS Y:\> $test2.GetType() 

IsPublic IsSerial Name          BaseType    
-------- -------- ----          --------    
True  True  String         System.Object  
True  True  Object[] 

一是String型的,另一個是Object Array,當你有一個單一的元素哈希表,PowerShell分配當它看到它作爲一個字符串:

回答

2

運行在你的腳本的末尾以下到一個變量。

PS Y:\> $test1 = ToArray $h1 
PS Y:\> $test1.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

所以PowerShell然後將拼接在$h3所有元素爲一個大字符串使用+=時,你要添加ArrayString

鑑於$test2您正在添加Array到和Array這意味着您將看到輸出爲一個較大的數組輸出。

爲了避開此明確定義$test1的類型和數組:

[array]$test1 = $h1 
+0

我有一種感覺,這是一個字符串,但如何才能指定者可能返回一個字符串,如果我明確地做$ RET = @() 在裏面? – Eiver

+0

@Eiver ToArray返回一個由1個元素組成的數組,當它被分配給一個以前沒有定義過的變量時,它將取對象的字符串值,而不是數組的自身,所以你最終會得到同樣的結果。 – Richard

+0

奇怪的是,如果我添加[數組]並運行一次腳本並將其刪除,那麼PowerShell ISE將「記住」它是一個數組類型,直到我重新啓動它。非常奇怪和不一致的行爲。 – Eiver

相關問題