2017-06-14 1 views
4

get-wmiコマンドレットを使用してプロファイルを削除します。コードがループ内の各削除コマンドを通過すると、どのプロファイルが削除されているかを表示したいと思います。 windows powershellは、各ループの実行中に現在の変数をパイプラインに表示します。

$total = 0 
$count = 1 
foreach ($localpath in $dispaths) 
{$total = $total + 1} 
Foreach ($localpath in $dispaths) 
{cls 
write-host "Deleting Profile: $_.localpath ($count of $total)" 
$count = $count + 1 
get-wmiobject -class win32_userprofile -computername $cname | where 
{$_.localpath -eq $localpath.localpath} | foreach {$_.Delete()} 
} 

が、カウントが正しく動作しながら、表示行は文字通り示しています:私はこれを試してみました./localpath(135の1)

の代わりに、どんな現在の文字列を表示:プロファイルの削除

localpath変数の内部はです。 。それは変数の文字列があるべき何も表示さdoesntの(135の1)

削除プロフィール:$ ._ localPathにからそれはちょうどこのような何かを表示しました。どこが間違っていますか?

答えて

3

ループはForEachループではありません。ForEach-Objectです。したがって、ForEachステートメントで定義されている変数を使用する必要があります。

あなたForeach

Foreach ($localpath in $dispaths) 

だからあなたがいない$_

write-host "Deleting Profile: $_.localpath ($count of $total)" 

はなる変数$localpathのプロパティする必要があります:これは異なっていること

write-host "Deleting Profile: $($Localpath.localpath) ($count of $total)" 

注意あなたの最終行は、あなたが012を使用しているようにForEach-Objectのエイリアスとしてを指定します。これは行がForEach-Objectを使用して、値のため$_を使用するパイプラインがパイプラインを伝承があるため

ので
Get-WMIObject -Class Win32_UserProfile -ComputerName $cname | 
    Where-Object {$_.localpath -eq $localpath.localpath} | 
    ForEach-Object {$_.Delete()} 

:だからあなたのラインをより正確にように記述できます。しかし、親のForEachループの$localpathも使用します。

+0

もう一度BenHさんに、これがどのように表示されるか教えてください。 PowerShellスクリプトを最初から学んだことはありません。特定の問題を解決するために必要なだけなので、その背後にある多くの論理的な構文や構文が私の経験から欠落しています。 変更を加えてスクリプトを実行すると、それ以上のローカルパスが得られます。各行のローカルパスセルではなく、実行ごとに行全体が表示されます。これは次のようになります。 プロフィールの削除:@ {samaccountanme = rbobo; enabled = FALSE; Localpath = C:\ Users \ rbobo} .localpath(19中の135) 何か考えてみませんか? – soltkr

+0

@soltkrこの問題を解決するために、回答が更新されました。これは、変数を展開するときに引用符の内側にあるため、 '.property'を文字列として追加して変数を展開するだけです。 '$ variable.property'を部分式' $() 'の中に入れて、プロパティを評価します。 – BenH

+0

あなたは間違いなしです。新しいコードが完璧に機能しました! – soltkr

関連する問題