160

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 要素のコレクションを返すように強制する方法、または返された「もの」がコレクションではなくオブジェクトであるかどうかを判断するにはどうすればよいですか?

4

7 に答える 7

182

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> }
于 2012-06-19T18:52:10.070 に答える
15

結果を配列に強制して、Count プロパティを持つことができるようにします。単一オブジェクト (スカラー) には Count プロパティがありません。文字列には length プロパティがあるため、誤った結果が得られる可能性があります。Count プロパティを使用してください。

if (@($serverIps).Count -le 1)...

ところで、文字列にも一致するワイルドカードを使用する代わりに、-as 演算子を使用します。

[array]$serverIps = gwmi Win32_NetworkAdapterConfiguration -filter "IPEnabled=TRUE" | Select-Object -ExpandProperty IPAddress | Where-Object {($_ -as [ipaddress]).AddressFamily -eq 'InterNetwork'}
于 2012-06-19T18:51:58.540 に答える
9

事前に変数を配列として宣言しておけば、1つだけでも要素を追加できます...

これはうまくいくはずです...

$serverIps = @()

gwmi Win32_NetworkAdapterConfiguration 
    | Where { $_.IPAddress } 
    | Select -Expand IPAddress 
    | Where { $_ -like '*.*.*.*' } 
    | Sort | ForEach-Object{$serverIps += $_}
于 2012-06-19T18:53:24.123 に答える