2017-01-11 66 views
1

我相信我有這個沒有問題的工作之前,但現在我不知道是怎麼回事。PowerShell的哈希表沒有返回正確

Script1.ps1

$Output = PowerShell.exe -File "C:\Temp1\Script2.ps1" 
$Output.Value1 

Script2.ps1

$HashTable = New-Object PSObject -Property @{ 
    "Value1" = "Data1" 
    "Value2" = "Data2" 
    "Value3" = "Data3" 
} 
return $HashTable 

我期待得到一個乾淨的桌子,我可以從中提取數據,而是我得到這個:

screenshot

如果我只是運行Script2就可以了我自己可以使用$HashTable.Value1,但將它返回給Script1似乎是個問題。

+0

你'hashtable'實際上@開始。在這裏你正在創建一個'PSObject'。 – sodawillow

回答

3

當您運行PowerShell.exe - 你實際上調用外部命令,並導致你得到的是最有可能[System.Object[]]。您可以輕鬆地使用方法GetType驗證:

$Output.GetType() 

你應該運行PowerShell腳本的方式是透過電話運營商(&)或點採購操作(.)。前者將在自己的作用域中運行一個腳本(因此腳本中定義的變量/函數不會「泄漏」到父作用域中)。後者將執行腳本,就像它是父代的組成部分一樣。在你的情況下,呼叫運營商應該做你需要的東西:

$Output = & "c:\temp\Script1.ps1" 
# or - as there are no spaces in the path, so script acts as any other command... 
$Output = c:\temp\Script1.ps1 

這應該給你自定義對象,如預期。爲了得到公正哈希表 - 你不需要New-Object - 剛剛返回哈希表傳遞給該命令的參數Property

+0

太棒了,謝謝你。這一切都變得相當明顯。我開始使用'PowerShell.exe -File'來繞過路徑中環境變量的問題,但呼叫運營商也解決了這個問題。感謝您的幫助 –

1

同意sodawillow;只需使用:

[Hashtable] $HashTable = @{ 'Value1' = 'Data1'; 
          'Value2' = 'Data2'; 
          'Value3' = 'Data3' 
          } 
return $HashTable; 
2

您在不同的PowerShell進程中運行Script2.ps1。像散列表這樣的PowerShell對象不會跨進程邊界傳輸。相反,輸出轉換爲一個字符串數組。

示範:

PS C:\>$Output = powershell.exe -File '.\test.ps1' 
PS C:\>$Output 

Value1    Value2    Value3 
------    ------    ------ 
Data1    Data2    Data3 


PS C:\>$Output.GetType().FullName 
System.Object[] 
PS C:\>$Output[0].GetType().FullName 
System.String 
PS C:\>$Output | % { '=' + $_.Trim() + '=' } 
== 
=Value1    Value2    Value3= 
=------    ------    ------= 
=Data1    Data2    Data3= 
== 
==

運行在當前PowerShell進程的腳本(通過電話運營商如),以避免這種情況:

PS C:\>$Output = & '.\test.ps1' 
PS C:\>$Output 

Value1    Value2    Value3 
------    ------    ------ 
Data1    Data2    Data3 


PS C:\>$Output.GetType().FullName 
System.Management.Automation.PSCustomObject 
PS C:\>$Output.Value1 
Data1

邊注:爲@sodawillow中指出,對你的問題的評論你正在創建一個自定義對象,而不是一個哈希表。