2017-05-09 8 views
0

私はループする必要のあるサーバの配列を持っており、特定のサーバだけに属性が割り当てられています。ここでもしもforeach内のIf-elseが私が思うものを返さない場合

が配列です:アレイでは

$test = @('test_dc','test_fp','test_ts','test_ap') 

、私は(この順序で)ドメインコントローラ、ファイル/プリント、ターミナルサーバー、およびアプリケーションサーバーを持っています。

属性を取得する必要があるサーバーは、fp、ts、およびapサーバーだけです。

は、ここで私はこれまで試したものです:

foreach ($item in $test) { 
    Write-Host $item "`n" 
    Write-Host "Start IF here `n" 
    if ($item.Name -like '*fp*') { 
    Write-Host "Found $item" 
    } else { 
    Write-Host "ELSE `n" 
    Write-Host '-=-=-=-=-' 
    } 
} 

ここでそれからの出力があります:

 
PS C:\Users\me\Desktop> .\scratch.ps1 

test_dc 

Start IF here 

ELSE 

-=-=-=-=- 

test_fp 

Start IF here 

ELSE 

-=-=-=-=- 

test_ts 

Start IF here 

ELSE 

-=-=-=-=- 

test_ap 

Start IF here 

ELSE 

-=-=-=-=- 
PS C:\Users\me\Desktop> 

私はそれ動作するはずだと思うの方法によると、私はこれが表示されます。

 
... 
test_fp 

Found test_fp 
... 

私もこれを試しました:

if ($test -contains '*fp') { 
    Write-Host "Found $_" 
} else { 
    Write-Host 'end' 
} 

と空白行が表示されます。

+0

ワイルドカードとして扱うかのように文字列のアスタリスク部分を使用することは、powershellでは機能しません。アスタリスクを削除して試してみてください。その場合は正規表現パターンを使用してください。 – t0mm13b

+6

'$ item'は普通の文字列です。' name'プロパティはありません。 '$ item.name -like '* fp *''を '$ item -like '* fp *''に変更してください –

+1

それを画面上で見る唯一の目的はありますか? Write-Hostができるのはこれだけです。それはリダイレクトできません。 – lit

答えて

3

一致するかどうかにかかわらず、各アイテムの書き込みが不定であるため、ホストに追加情報が書き込まれています。 elseステートメントも含まれているので、一致しないアイテムのために書かれた余分なものを見るつもりです。 foreachループにはオブジェクトのname属性も指定され、$test配列には文字列のみが含まれます。ここで

は、それが *fp*と一致した場合、私はそうあなたの分周器書き込み、あなたのループ内でのみ書き込みホスト名に制限するためにそれを更新するものです。その意志の出力を実行

$test = @('test_dc','test_fp','test_ts','test_ap') 
foreach ($item in $test) { 
    if ($item -like '*fp*') { 
    Write-Host "Found $item" 
    } else { 
    Write-Host '-=-=-=-=-' 
    } 
} 

をこの:

-=-=-=-=- 
Found test_fp 
-=-=-=-=- 
-=-=-=-=- 
+0

ありがとうございます!私はそれがそれのようなものだと思ったが、わからなかった。好奇心の外に、私は2番目の例で '-like'に' -contains'を変更しました。スクリプトは期待通りに 'Found'を返しましたが、なぜ$ _ '? –

関連する問題