2012年5月31日木曜日

◆ActiveDirectoryコマンドレットでFilterの記述方法

Filterの記述方法が良く分からなかったので纏めておく。

サンプルを見るとこんな感じにシングルコーテーションで囲んでいる。

PS>Get-ADUser -filter 'SamAccountName -like "test*"' | select SamAccountName

SamAccountName
--------------
test
test2

ダブルコーテーションとシングルコーテーションを入れ替えても大丈夫。

PS>Get-ADUser -filter "SamAccountName -like 'test*'" | select SamAccountName

SamAccountName
--------------
test
test2

{}で囲んであげるサンプルも載っていた。

PS>Get-ADUser -filter {SamAccountName -like "test*"} | select SamAccountName

SamAccountName
--------------
test
test2

コマンドを組み合わせると条件は変数指定になることが多くなると思うので変数でも試してみる。

PS>$st = "test*"


シングルコーテーションはOK

PS>Get-ADUser -filter 'SamAccountName -like $st' | select SamAccountName

SamAccountName
--------------
test
test2


{}で囲むのもOK

PS>Get-ADUser -filter {SamAccountName -like $st} | select SamAccountName

SamAccountName
--------------
test
test2


ダブルコーテーションはエラーになる

PS>Get-ADUser -filter "SamAccountName -like $st" | select SamAccountName
Get-ADUser : クエリ解析エラー: 'SamAccountName -like test*' エラー メッセージ: 'syntax error' 場所: '22'。
発生場所 行:1 文字:11


こんな感じにコーテーションの追加が必要みたい

PS>Get-ADUser -filter "SamAccountName -like '$st'" | select SamAccountName

SamAccountName
--------------
test
test2

 

次は変数が以下のようなプロパティの場合。

PS>($st = 1 | select prop).prop = "test*"
PS>$st.prop
test*

シングルコーテーションはエラーになる。

PS>Get-ADUser -filter 'SamAccountName -like $st.prop' | select SamAccountName
Get-ADUser : 種類: 'System.Management.Automation.PSCustomObject' のオブジェクトでプ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter 'SamAccountName -like $st.prop' | select SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser]、ArgumentException
    + FullyQualifiedErrorId : 種類: 'System.Management.Automation.PSCustomObject'
見つかりません。,Micros    oft.ActiveDirectory.Management.Commands.GetADUser

{}で囲んでも駄目

PS>Get-ADUser -filter {SamAccountName -like $st.prop} | select SamAccountName
Get-ADUser : 種類: 'System.Management.Automation.PSCustomObject' のオブジェクトでプ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter {SamAccountName -like $st.prop} | select SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser]、ArgumentException
    + FullyQualifiedErrorId : 種類: 'System.Management.Automation.PSCustomObject' の
見つかりません。,Micros    oft.ActiveDirectory.Management.Commands.GetADUser

当然ダブルコーテーションも駄目

PS>Get-ADUser -filter "SamAccountName -like $st.prop" | select SamAccountName
Get-ADUser : クエリ解析エラー: 'SamAccountName -like @{prop=test}.prop' エラー メッ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter "SamAccountName -like $st.prop" | select SamAccountName
    + CategoryInfo          : ParserError: (:) [Get-ADUser]、ADFilterParsingExcept
    + FullyQualifiedErrorId : クエリ解析エラー: 'SamAccountName -like @{prop=test}
or' 場所: '22'。,M    icrosoft.ActiveDirectory.Management.Commands.GetADUser

どうすればよいんでしょうね。
まぁ、一旦変数に入れれば良いだけではあるのですがなんとなく残念な気持ち。

プロパティをFilterに使うことは多くないのかもしれませんが、配列要素なんかも同様に駄目そうなので・・・。

かろうじてダブルコーテーションで式の評価を強制させた場合はうまくいく。

PS>Get-ADUser -filter "SamAccountName -like '$($st.prop)'" | select SamAccountName

SamAccountName
--------------
test
test2

ちょっと場当たり的に試しただけで理由が分かっていないのでいずれ機会があったらもう少し調べてみたい。

0 件のコメント:

コメントを投稿