2017-01-11 8 views
1

以前は問題なく動作していたと確信していますが、今は何が起こっているのか分かりません。PowerShell Hashtableが正しく返されない

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

ハッシュテーブルは実際には@で始まります。ここでは 'PSObject'を作成しています。 – sodawillow

答えて

3

PowerShell.exeを実行しているときに効果的に外部コマンドを呼び出すと、ほとんどの場合は[System.Object[]]になります。あなたはPowerShellスクリプトを実行する必要があります方法は、呼び出し演算子(&)またはドットソーシング事業者(.)のいずれかである

$Output.GetType() 

:あなたは法GetTypeを使用して簡単に確認することができます。 Formerは独自のスコープでスクリプトを実行します(スクリプトで定義された変数/関数は親スコープに "リーク"しません)。後者は、それが親の不可欠な部分であるかのようにスクリプトを実行します。あなたのケースでは、コールオペレータは必要なものを行う必要があります:

$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

Script2.ps1を別のPowerShellプロセスで実行しています。ハッシュテーブルのような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がで指摘したようにあなたの質問へのコメントはハッシュテーブルではなくカスタムオブジェクトを作成しています。

関連する問題