none
Dateien nur löschen lassen wenn sie auch da sind. RRS feed

  • 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?

    Dienstag, 24. Juli 2012 11:39

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
    Dienstag, 24. Juli 2012 11:53

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
    Dienstag, 24. Juli 2012 11:53
  • 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

    Dienstag, 24. Juli 2012 12:15
  • 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 $Error


    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' '

    Dienstag, 24. Juli 2012 12:51
  • 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`?
    Dienstag, 24. Juli 2012 13:30
  • 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-Path

    Schau 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' '

    Dienstag, 24. Juli 2012 14:43
  • Hallo Peter,

    vielen Dank für Deine Hilfen :) Ich werde Deine Tipps beherzigen 

    Liebe Grüße

    Ingo

    Mittwoch, 25. Juli 2012 05:45