Benutzer mit den meisten Antworten
Dateien nur löschen lassen wenn sie auch da sind.

Frage
-
Hallo allerseits,
ich habe folgendes Script erstellt (seht mir Fehler nach, ich fange gerade erst mit Powershell an):
$Computers = Get-content c:\skripte\Powershell\Comp.csv foreach ($Computer in $Computers) { Remove-Item e:\test\PCs\$Computer\Datei\TEST.txt -whatif }
Damit möchte ich in verschiedenen Verzeichnissen die Datei TEST.txt löschen lassen. Klappt auch soweit, nur nicht ohne Fehlermeldungen, und zwar immer dann wenn die Datei nicht da ist (Der Pfad "e:\test\PCs\PC123454\Datei\TEST.txt" kann nicht gefunden werden, da er nicht vorhanden ist. Wie kann ich das umgehen? Gibt es eine Möglichkeit vorab abzufragen ob die Datei da ist, und wenn das soll sie gelöscht werden?
Antworten
-
Hallo Ingo! Willkommen!
Das kannst du auf zwei Arten machen:
Einmal in dem du die Fehlermeldung mit SilentlyContinue unterdrückst. Das ist aber nicht so sauber!
Gib bitte dazu mal den folgenden Befehl ein und lies den Abschnitt -ErrorAction:
Get-Help about_CommonParameters$Computers = Get-content c:\skripte\Powershell\Comp.csv foreach ($Computer in $Computers) { Remove-Item e:\test\PCs\$Computer\Datei\TEST.txt -whatif -ErrorAction SilentlyContinue }
Oder du benutzt ein IF (eine Wenn Dann Bedingung) mit dem dem Cmdlet Test-Path.
Gib bitte dazu mal folgende Befehle ein:
Get-Help about_If
Get-Help Test-Path$Computers = Get-content c:\skripte\Powershell\Comp.csv foreach ($Computer in $Computers) { If (Test-Path e:\test\PCs\$Computer\Datei\TEST.txt) { Remove-Item e:\test\PCs\$Computer\Datei\TEST.txt -whatif } }
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Als Antwort markiert Der Ingo Dienstag, 24. Juli 2012 12:12
- Bearbeitet Peter Kriegel Dienstag, 24. Juli 2012 12:21
Alle Antworten
-
Hallo Ingo! Willkommen!
Das kannst du auf zwei Arten machen:
Einmal in dem du die Fehlermeldung mit SilentlyContinue unterdrückst. Das ist aber nicht so sauber!
Gib bitte dazu mal den folgenden Befehl ein und lies den Abschnitt -ErrorAction:
Get-Help about_CommonParameters$Computers = Get-content c:\skripte\Powershell\Comp.csv foreach ($Computer in $Computers) { Remove-Item e:\test\PCs\$Computer\Datei\TEST.txt -whatif -ErrorAction SilentlyContinue }
Oder du benutzt ein IF (eine Wenn Dann Bedingung) mit dem dem Cmdlet Test-Path.
Gib bitte dazu mal folgende Befehle ein:
Get-Help about_If
Get-Help Test-Path$Computers = Get-content c:\skripte\Powershell\Comp.csv foreach ($Computer in $Computers) { If (Test-Path e:\test\PCs\$Computer\Datei\TEST.txt) { Remove-Item e:\test\PCs\$Computer\Datei\TEST.txt -whatif } }
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
- Als Antwort markiert Der Ingo Dienstag, 24. Juli 2012 12:12
- Bearbeitet Peter Kriegel Dienstag, 24. Juli 2012 12:21
-
Hallo Peter,
danke für die freundliche Aufnahme und die Lösung meines Problemes :) Das klappt wunderbar, gibt es noch die Möglichkeit mittels echo dann auszugeben das die Datei auf dem PC gelöscht wurde? Ich dachte an sowas in etwa {echo "$Computer Datei wurde auf dem PC gelöscht"}. Ich weiß nur noch nicht wie ich die hinter das "If" richtig bekomme.
Lieben Gruß
Der Ingo
-
Man könnte das einfach in die klammern von IF als nächste Zeile einfügen.
Man kann dazu Echo (Write-Output) oder Write-Host nutzen, das brauchst du bei PowerShell nicht, da in der PowerShell jedes Ergebnis von jeder Zeile ausgegeben wird.$Computers = Get-content c:\skripte\Powershell\Comp.csv $DateiPfad = 'e:\test\PCs\$Computer\Datei\TEST.txt' foreach ($Computer in $Computers) { If (Test-Path $DateiPfad) { Remove-Item $DateiPfad -whatif "Ich habe die Datei $DateiPfad auf dem Computer $Computer gelöscht !" } }
Da auch beim Löschen etwas schief gehen kann (die Datei ist gesperrt oder du hast keinen Zugriff) sollte man auch abfragen ob bei dem Löschen etwas schiefgegangen ist.
Dies kannst du über die in PowerShell eingebaute Variable $? in kombination mit einem weiteren IF Auslesen:
Get-Help about_automatic_variables$? Enthält den Ausführungsstatus des letzten Vorgangs. Enthält
TRUE, wenn der letzte Vorgang erfolgreich war; FALSE, wenn
beim letzten Vorgang ein Fehler aufgetreten ist.$Computers = Get-content c:\skripte\Powershell\Comp.csv $DateiPfad = 'e:\test\PCs\$Computer\Datei\TEST.txt' foreach ($Computer in $Computers) { If (Test-Path $DateiPfad) { Remove-Item $DateiPfad -whatif If ($?) { "Ich habe die Datei $DateiPfad auf dem Computer $Computer gelöscht !" } Else { Write-Error "Fehler beim Löschen der Datei $DateiPfad auf dem Computer $Computer!" } } }
Wenn du dich mit der Fehlerbehandlung in PowerShell befassen willst dann empfehle ich dir die folgenden Quellen:
Get-Help about_Trap
Get-Help about_Try_Catch_Finally
Get-Help about_CommonParameters # den Abschnitt –ErrorActionund –ErrorVariable
Get-Help about_automatic_variables # die Abschnitte $? Und $ErrorPlease click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' ' -
Hallo Peter, nochmals danke :) Ich habe ein wenig herum experimentiert, scheitere aber nun daran 2 Variablen zu einer zu verbinden:
$Computers = Get-content c:\skripte\Powershell\Computernamen.csv $DateiPfad = 'c:\Dateien\TEST\$Computer\Test\' $Merker = "Testdatei1.txt" $GesamtPfad = $DateiPfad + $Merker foreach ($Computer in $Computers) { if (Test-Path $GesamtPfad) { Remove-Item $GesamtPfad If ($?) { "$Computer $DateiPfad$Merker auf dem Computer gelöscht !" } Else { Write-Error "Fehler beim Löschen der Datei $DateiPfad auf dem Computer $Computer!" } } else {echo "$Computer Datei existierte nicht auf dem PC"} }
Er löscht die Datei nicht, weder über meinen Versuch die beiden Variablen $DateiPfad $Merker zu verbinden als $Gesamtpfad, als auch wenn ich $DateiPfad$Merker
eingebe, es erscheint immer das die Datei nicht auf dem PC existiert. Schreibe ich allerdings die $DateiPfad (z.B. C:\TEST\123\) aus, und hänge die $Merker an, wird die Datei gelöscht. Ich würde mir gerne etwas Arbeit mit den beiden Variablen ersparen. Hast Du noch einen Tipp`? -
Das liegt zum einen daran das die folgende Zeile falsch ist!
$DateiPfad = 'c:\Dateien\TEST\$Computer\Test\'Du benutzt hier einzelne Anführungszeichen! Diese verhindern das die Variable $Computer durch ihren Wert ersetz werden.
Probiere mal folgendes:
$Computer = 'Theobald' "Ich bin der Computer und heiße $Computer" 'Ich bin der Computer und heiße $Computer'
Lies bitte dazu :
http://www.powershellpraxis.de/Die-Variablen.947.0.html#c4074
und gib bitte dazu mal den folgenden Befehl ein
Get-Help about_Variables
Ebenso ist in der Zeile der $Computername noch leer, da er erst in der foreach schleife gefüllt wird !!!!!!!!!
$DateiPfad = 'c:\Dateien\TEST\$Computer\Test\'Wenn du in dem Pfad den Computernamen einbauen willst dann musst du das in der Schleife machen, da die Variable sich nur in der schleife ändert !
$Computers = 'Willi','Bernd','Werner','Renate','Sabine' ForEach ($Computer in $Computers) { "C:\Dateien\TEST\$Computer\Test" } # end ForEach
Die folgende Zeile mit dem + ist zwar richtig, …
$GesamtPfad = $DateiPfad + $Merker
… aber für die verarbeitung von Pfaden hat PowerShell eigene Cmdlets die man benutzen kann, dort braucht man sich dann nicht um die Schrägstriche zu kümmern!$Computers = Get-content c:\skripte\Powershell\Computernamen.csv $Merker = "Testdatei1.txt" ForEach ($Computer in $Computers) { "Ich bearbeite nun den Computer $Computer" $DateiPfad = "C:\Dateien\TEST\$Computer\Test" $GesamtPfad = Join-Path $DateiPfad $Merker "mit dem Pfad: $GesamtPfad" If (Test-Path $GesamtPfad) { Remove-Item $GesamtPfad If ($?) { "$Computer $DateiPfad$Merker auf dem Computer gelöscht !" } # end if $? Else { Write-Error "Fehler beim Löschen der Datei $DateiPfad auf dem Computer $Computer!" } # end else $? } # end if Test-Path Else { Write-Warning "Die Datei: $GesamtPfad existierte nicht auf dem Computer: $Computer" } # end else Test-Path } # end ForEach
gib bitte dazu mal folgende Befehle ein
Get-Help Join-Path
Get-Help Split-Path
Get-Help Resolve-Path
Get-Help Test-Path
Get-Help Convert-PathSchau die auch noch einmal an wie ich Write-Warning und Write-Error benutze!
Get-Help Write-Warning
Get-Help Write-Error
Ebenso schau die Mal an wie ich mit den Klammern und der Einrückung umgehe!
Bei verschachtelten Klammern kann man irgendwann den Code nicht mehr lesen, wenn man nicht ordentlich einrückt.
Eine schließende Klammer steht immer auf derselben Ebene wie das Öffnende Kommando!
(ebenso kann man sich hinter die schließende klammer eine Hilfe schreiben wozu diese Klammer gehört)
Deshalb schreibe ich auch einzeilige IF oder Foreach oder.. nicht in eine Zeile!Tschüss Peter!
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Dienstag, 24. Juli 2012 14:43