2016-10-05 5 views
1

次のコードを実行すると、次の結果が得られます。ワイルドカード検索で出力を表示しない

import-module activedirectory 
Get-ADComputer -Filter {Name -Like "*1234*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

Name  OperatingSystem  OperatingSystemServicePack 
----  ---------------  -------------------------- 
DEP12345LT             
CLC41234DT Windows 7 Enterprise Service Pack 1    
A123456 Windows 7 Enterprise Service Pack 1  

しかし、私はこのコード

import-module activedirectory 
$assetid = Read-Host "Assest id" 
Get-ADComputer -Filter {Name -Like "*$assetid*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

を実行したときに、私は、tryが変数を渡すとき

PS U:\> V:\General Helpful Scripts and Code\wild_card_pc_number_finder.ps1 
Assest id: 1234 

PS U:\> 

は、なぜそれが結果に表示されないのですか?

答えて

1

-Filterのパラメータが文字列"*$assetid*"を正しく評価していないようです。最初に別の変数に文字列を作成して使用すると、それが機能します。

Import-Module activedirectory 
$assetid = Read-Host "Assest id" 
$like = "*$assetid*" 
Get-ADComputer -Filter {Name -Like $like} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto 

これを回避するもう1つの方法は、-Filterパラメータ(more info)についてPowerShell Expression Language Syntaxの文字列を作成し使用することです。私は下にこれが動作しない理由を立つことができるものから、

-Filter "Name -like '*$assetid*'" 

PowerShellあなたは終了しますので、文字列は基本的にあるPowerShell Expression Language Syntax{Name -Like "*$assetid*"}を変換しようとしていることであるあなたは意志変換した後、このような何か。

'Name -Like "*$assetid*"' 

これは変数の値ではなく、*$assetid*を意味します。

これは、私が提供している2番目の例を使用できる理由です。 PowerShellは、パラメータを渡す前に文字列を評価します。使用していたメソッドが{ .. }スクリプトブロックを渡しているのに対して、コマンドレットはPS式言語構文に変換しようとします。

+0

Cool!出来た!それを評価できない理由はありますか?なぜ私は文字列を先に作成して渡す必要があるのですか? – TuckRollworthy

+0

@TuckRollworthy私は自分の答えを更新し、なぜこれが機能していないのか説明しようとしました。 – Richard

関連する問題