web-dev-qa-db-ja.com

Powershell:2次元配列

以下は期待どおりに機能します。

$values = @( ("a", "b"), ("c", "d") )
foreach($value in $values)
{
  write-Host "Value 0 =" $value[0]
  write-Host "Value 1 =" $value[1]
}

(1)の結果:

Value 0 = a
Value 1 = b
Value 0 = c
Value 1 = d

しかし、$ values変数を次のように変更すると:

$values = @( ("a", "b") )

結果(2)は次のとおりです。

Value 0 = a
Value 1 =
Value 0 = b
Value 1 =

一方、result(3)は次のようになります。

Value 0 = a
Value 1 = b

$ valueの変更:

$values = @( ("a"), ("b") )

上記のresult(2)と同じ結果を返します。これらは非常に異なるデータ表現です。

私が書いているスクリプトは、最初の次元の長さが0からNまでの2次元配列を処理できる必要があります。最初のレベルの要素を追加する必要がある場合は、スクリプトを書きたいです(または削除)スクリプトのロジックを変更する必要がないこと。 「データ」を編集するだけでいいのですが。

だから私の質問は次のとおりです:配列の最初の次元の長さが1であるときに、示されているforeachループが正しく機能するように、2次元配列を表記するにはどうすればよいですか?

get-Hostは次のように応答します。

Name             : ConsoleHost
Version          : 2.0
InstanceId       : 2338657f-e474-40d8-9b95-7e2b5f6a8acf
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
11

これは、PowerShellの配列処理動作が予期しない結果を引き起こす可能性がある別のケースです。

目的の結果を得るには、コンマトリック(配列演算子)を使用する必要があると思います。

$values = @( ,("a", "b") )
foreach($value in $values)
{
  write-Host "Value 0 =" $value[0]
  write-Host "Value 1 =" $value[1]
}

結果:

Value 0 = a
Value 1 = b

実際に必要なのはこれだけです:

$values = ,("a", "b")

この記事では、PowerShellの配列の処理について詳しく説明します。

http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx

14
Andy Arismendi