2017-06-14 3 views
4

Im Löschen von Profilen mit dem Befehl get-wmi. Da der Code jeden Löschbefehl in der Schleife durchläuft, möchte ich anzeigen, welches Profil gelöscht wird. Ich versuchte dies:Windows Powershell zeigt die aktuelle Variable in der Pipeline während einer Schleife für jede Schleife an

$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()} 
} 

aber während der Zählung richtig funktioniert, zeigt die Anzeigezeile wörtlich:

löschen Profil: ./localpath (1 von 135)

statt Anzeige unabhängig von der aktuellen Zeichenkette innerhalb der localpath-Variable ist. Ich habe versucht, das zu entfernen. von ._ localpath $ aber, dass nur angezeigt etwas wie folgt aus:

löschen Profil: (1 von 135)

es tut nichts anzuzeigen, in dem die Variable Zeichenfolge sein sollte. Wo gehe ich falsch?

Antwort

3

Die Schleife ist eine ForEach Schleife keine ForEach-Object. Sie müssen also die im ForEach Statement definierte Variable verwenden.

Ihre Foreach:

Foreach ($localpath in $dispaths) 

So werden Sie zu Eigenschaften auf der Variable $localpath brauchen nicht $_

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

würde:

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

Beachten Sie, dass dies unterscheidet sich von Ihre letzte Zeile, wie Sie 012 verwendenals Alias ​​für ForEach-Object. So Ihre Linie mehr könnte genau geschrieben wie:

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

So, da diese Linie ForEach-Object verwendet ist und die Pipeline Sie $_ für die Werte verwenden, übergeben Sie die Pipeline nach unten. Verwendet aber auch $localpath von der übergeordneten ForEach Schleife.

+0

Danke nochmal BenH, dass du dir die Zeit genommen hast, mir zu zeigen, wie das geht. Ich habe Powershell-Skripte nie wirklich von Grund auf gelernt. Ich brauche es nur, um bestimmte Probleme zu lösen, so dass viele der logischen Konstrukte und die Syntax dahinter in meiner Erfahrung fehlen. Wenn ich das Skript mit Ihren Änderungen ausführen, bekomme ich mehr als nur den lokalen Pfad. Es zeigt die gesamte Zeile für jeden Lauf und nicht nur die lokale Pfadzelle für jeden. Es sieht so aus: Profil löschen: @ {samaccountanme = rbobo; aktiviert = FALSCH; Localpath = C: \ Benutzer \ rbobo} .localpath (19 von 135) keine Idee warum? – soltkr

+0

@soltkr Antwort aktualisiert, um das Problem zu beheben. Das liegt daran, dass beim Erweitern von Variablen innerhalb von Anführungszeichen die Variable expandiert, wobei '.property' als Zeichenfolge angehängt wird. Setzen Sie also die '$ variable.property' in einen Teilausdruck' $() 'und es wird die Eigenschaft ausgewertet. – BenH

+0

Sie sind absolut richtig. neuer Code hat perfekt funktioniert! – soltkr