1. ホーム
  2. powershell

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

2022-04-26 01:56:33

質問

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]

Powershellは配列を返すので、配列の長さをクエリして、1番目と2番目のアドレスをうまく取り出すことができます。

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

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

どのように解決するのですか?

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> }