2016-04-19 35 views
0

これは私をナットにしています。for-EachObjectループ反復変数の問題

名前が「John」で始まるすべてのユーザーに対して、ユーザーのユーザー名と名前のテキストファイルを作成するスクリプトを作成します。ここで

はスクリプトです:

Get-ADUser -Filter {name -like "John*"} -Property Name, SamAccountName | 
ForEach-Object { 
    Get-ADUser -Filter {name -eq $_.Name} | 
    Select-Object -Property Name, SamAccountName | 
    Out-File "c:\PS\$_.Name.txt" 
} 

これは動作しますが、アウトファイル(複数可)の名前は、ユーザー名ではなく、むしろそれはそののADsPathです。 CN=John Doe,OU=Users,DC=contoso,DC=local.Name.txt

何らかの理由により、$_.NameがアウトファイルCMD-letで正しく解決されません。 $_はオブジェクトを適切にリフレッシュしますが、は単なる文字列として解釈されます

WriteHost $_.NameなぜですかOut-File "C:\PS\$_.Name.txt"

答えて

1

"$_.Name"文字列の中にあるため、PowerShellは目的の式ではなく変数のみを展開します。そのためには、"$($_.Name)"が必要です。 $()のすべてが単一の式として評価されます。詳細はabout_Quoting_Rulesを参照してください。

+0

これはまさに私が望んでいた、ちょうどそれを行う方法を知らなかった:)ありがとう! –

0

だけで実行します。

Out-File ("c:\PS\" + $_.Name + ".txt") 

どのように可変絞りとあなたのテキストが起動しない場所を知っているPowerShellのでしょうか?それは賢明ではありません。それは$シンボルを探しており、その後ろの単語を変数と見なします。残りはすべてテキストです。変数と一緒に使うことができますが、ここでは変数のプロパティでそれを使用します。

+0

:あなたは$()構文を使用する必要があり、この作業を行います。引数 "+"は、ValidateSet属性で指定された "unknown、string、unicode、bigendianunicode、utf8、utf7、utf32、ascii、default、oem"セットに属していません。 –

+0

'(" c: PS \ "+ $ _。Name +" .txt ")' –

1

変数のみが文字列で展開され、プロパティは展開されません。パラメーター「encoding」の上で引数を検証することはできません:この、取得 `アウトファイルをしようとしました

Out-File "c:\PS\$($_.Name).txt"