呼び出しが 1 つのオブジェクトのみを返す場合に、Powershell に配列を返すように強制するにはどうすればよいですか? 質問する

呼び出しが 1 つのオブジェクトのみを返す場合に、Powershell に配列を返すように強制するにはどうすればよいですか? 質問する

Powershell を使用して Web サーバー上で IIS バインディングを設定していますが、次のコードで問題が発生しています。

$serverIps = gwmi Win32_NetworkAdapterConfiguration 
    | Where { $_.IPAddress } 
    | Select -Expand IPAddress 
    | Where { $_ -like '*.*.*.*' } 
    | Sort

if ($serverIps.length -le 1) {
    Write-Host "You need at least 2 IP addresses for this to work!"
    exit
}

$primaryIp = $serverIps[0]
$secondaryIp = $serverIps[1]

サーバーに 2 つ以上の IP がある場合は問題ありません。Powershell は配列を返すので、配列の長さを照会して、最初のアドレスと 2 番目のアドレスを正常に抽出できます。

問題は、IP が 1 つしかない場合、Powershell は 1 要素の配列を返さず、IP アドレス (「192.168.0.100」のような文字列として) を返すことです。文字列にはプロパティがあり.length、1 より大きいため、テストは成功し、コレクションの最初の 2 つの IP アドレスではなく、文字列の最初の 2 文字が返されます。

Powershell に 1 要素のコレクションを返すように強制するか、返される「もの」がコレクションではなくオブジェクトであるかどうかを判断するにはどうすればよいでしょうか。

ベストアンサー1

2 つの方法のいずれかで変数を配列として定義します...

@パイプされたコマンドは、先頭にを付けて括弧で囲みます。

$serverIps = @(gwmi Win32_NetworkAdapterConfiguration 
    | Where { $_.IPAddress } 
    | Select -Expand IPAddress 
    | Where { $_ -like '*.*.*.*' } 
    | Sort)

変数のデータ型を配列として指定します。

[array]$serverIps = gwmi Win32_NetworkAdapterConfiguration 
    | Where { $_.IPAddress } 
    | Select -Expand IPAddress 
    | Where { $_ -like '*.*.*.*' } 
    | Sort

または、変数のデータ型を確認してください...

IF ($ServerIps -isnot [array])
{ <error message> }
ELSE
{ <proceed> }

おすすめ記事