none
Arbeiten mit IF-Bedinugen RRS feed

  • Frage

  • Hallo liebe Community,

    habe da wieder einmal eine Frage.
    Es geht hier um die IF - Konstruktion.

    Ich möchte aus einem Unterverzeichnis alle darin enthaltenen Dateien in
    das darüber liegende Verzeichnis verschieben.

    Das ganze sieht so aus:

    Verzeichnis A
     Unterverzeichnis a
     -> Dateien .jpg
    Verzeichnis B
     Unterverzeichnis b
     -> Dateien .jpg
    Verzeichnis C
     Unterverzeichnis C
     -> Dateien .jpg

    Jetzt sollen die .jpg - Dateien aus dem Unterverzeichnis a in das Verzeichnis A verschoben werden.
    Das klappt auch soweit.

    Das eigentliche Problem für mich ist nun, die If-Konstruktion so zu anwenden, dass es am Ende mir keine
    Fehlermeldung in den Host schreibt, wenn es das Verzeichnis (XYZ) nicht gibt, sondern es einfach zurückkehrt
    und ich den nächsten Befehl ab arbeiten kann.

    $Path = "C:\Users\powershell\Workzone\Verzeichnisse\"

    $test = "C:\Users\powershell\Workzone\Verzeichnisse\"

    # es soll nach dem 1. Verzeichnis gesucht werden if ($test[0]) { Set-Location $Path } else {Set-Location C:\Users\powershell} $weiter = gci $Path ; # wenn es vorhanden ist, soll es als aktuelles Verzeichnis gesetzt werden $weiter[0] | Set-Location ; # jetzt verschiebe ich die .jpg Move-Item .\.actors\* .\ ; # kehre zu meinem ursprünglichen Verzeichnis zurück Set-Location C:\Users\powershell ; #wird nach dem 2. Verzeichnis gesucht if ($test[1]) { Set-Location $Path } else {Set-Location C:\Users\powershell} $weiter = gci $Path ; # wenn es vorhanden ist, soll es als aktuelles Verzeichnis gesetzt werden $weiter[1] | Set-Location ; # jetzt verschiebe ich die .jpg Move-Item .\.actors\* .\ ; # kehre zu meinem ursprünglichen Verzeichnis zurück Set-Location C:\Users\powershell #dies soll geschehen bis die Abfrage ins Leere geht, weil gesuchtes Verzeichnis nicht vorhanden ist. if ($test[6]) { Set-Location $Path } else {Set-Location C:\Users\powershell} $weiter = gci $Path ; # wenn es vorhanden ist, soll es als aktuelles Verzeichnis gesetzt werden # was eigentlich jetzt nicht gehen sollte, weil dieses Verzeichnis nicht gibt $weiter[6] | Set-Location


    Habt Ihr da einen Tipp?
    Vielleicht auch wo ich (wenn es geht uff doitsch) vielleicht nachlesen könnte.

    LG
    Svensus


    • Bearbeitet Svensus Montag, 6. April 2015 16:02 Formel verbessert
    Montag, 6. April 2015 12:58

Antworten

  • Sorry! Das war nicht nur easy, sondern ein ganz schlechter Rat!
    Jetzt weiss er immer nochnicht wie man mit IF(){} arbeitet.

    Man sollte eigentlich NIEMALS die $ErrorActionPreference='SilentlyContinue' setzen.

    Das ist die Straußenpolitik oder Vogel-Strauß-Politik
    Den Kopf in den Sand stecken ist eine Redewendung und bedeutet so viel wie: Eine drohende Gefahr nicht sehen wollen, die Augen vor unangenehmen Realitäten verschließen oder bestimmte Tatsachen einfach nicht zur Kenntnis nehmen wollen oder eine bevorstehende körperliche oder geistige unangenehme Arbeit nicht sehen wollen, also glatt zu ignorieren. (Quelle: Wikipedia)

    Dadurch stellt man sich einfach nur selbst ein Bein.
    Fehler die man nicht mehr sieht, sind trotzdem noch vorhanden.
    Wenn das Skript nicht richtig geht, sucht man sich blöde warum das Skript nicht geht, weil man die Fehlermeldungen nicht mehr sieht.

    Ein Fehler kann auch indirekte folgen haben, deshalb sollte man Fehler in einem Skript möglichst IMMER Ordentlich behandeln (z.B. mit Try{}Catch{}) oder eben durch If(){} vermeiden. Was hier sehr leicht ist!

    Dein Ansatz mit dem If(){} war schon SEHR richtig!

    Um zu testen ob ein Verzeichnis vorhanden ist, kann man das Cmdlet Test-Path benutzen.
    Dieses liefert $True (für Ja ist vorhanden) oder $False (für nein ist nicht vorhanden).

    Beispiel:

    # Testen ob der Pfad C:\windows vorhanden ist
    If(Test-Path -Path 'C:\windows') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\windows ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    } Else {
      # wenn die IF Bedingung $False ergibt, springt der hier in diese Else Klammern {}
      # Else {} kann man auch weglassen!
      Write-Warning 'C:\windows ist NICHT vorhanden!'
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }
    
    # Nochmal ein IF(){} mit einem Pfad der nicht vorhanden ist
    
    # Testen ob der Pfad C:\Ein\Pfad\nach\nirgendwo vorhanden ist
    If(Test-Path -Path 'C:\Ein\Pfad\nach\nirgendwo') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\Ein\Pfad\nach\nirgendwo ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    } Else {
      # wenn die IF Bedingung $False ergibt, springt der hier in diese Else Klammern {}
      # Else {} kann man auch weglassen!
      Write-Warning 'C:\Ein\Pfad\nach\nirgendwo ist NICHT vorhanden!'
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }

    Ich habe oben mit Write-Warning eine Meldung ausgegeben, wenn der Pfad nicht vorhanden ist. Du willst ja keine Meldung, also lass einfach den Else {} Block weg!

    # Testen ob der Pfad C:\windows vorhanden ist
    If(Test-Path -Path 'C:\windows') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\windows ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }
    
    # Nochmal ein IF(){} mit einem Pfad der nicht vorhanden ist
    
    # Testen ob der Pfad C:\Ein\Pfad\nach\nirgendwo vorhanden ist
    If(Test-Path -Path 'C:\Ein\Pfad\nach\nirgendwo') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\Ein\Pfad\nach\nirgendwo ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }

    Um IF(){} zu verstehen lies die gute PowerShell Dokumentation!

    Get-Help about_IF

    oder siehe: http://www.colorconsole.de/PS_Windows/de/about_If.htm


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Dienstag, 7. April 2015 11:37
    • Als Antwort markiert Svensus Mittwoch, 8. April 2015 11:49
    Dienstag, 7. April 2015 05:32

Alle Antworten

  • Hallo, probier mal oben in deinen Script die Variable
    $ErrorActionPreference='SilentlyContinue'

    und führe dein Script dann mal aus. Das bewirkt, dass bei einem Fehler keine Fehlermeldung als Ausgabe erscheint und die Abarbeitung trotzdem erfolgt.

    Gruß Toni




    Montag, 6. April 2015 19:34
  • Hallo Toni,

    des war ja richtig easy.

    Danke

    Lg

    Svensus

    Montag, 6. April 2015 23:03
  • Sorry! Das war nicht nur easy, sondern ein ganz schlechter Rat!
    Jetzt weiss er immer nochnicht wie man mit IF(){} arbeitet.

    Man sollte eigentlich NIEMALS die $ErrorActionPreference='SilentlyContinue' setzen.

    Das ist die Straußenpolitik oder Vogel-Strauß-Politik
    Den Kopf in den Sand stecken ist eine Redewendung und bedeutet so viel wie: Eine drohende Gefahr nicht sehen wollen, die Augen vor unangenehmen Realitäten verschließen oder bestimmte Tatsachen einfach nicht zur Kenntnis nehmen wollen oder eine bevorstehende körperliche oder geistige unangenehme Arbeit nicht sehen wollen, also glatt zu ignorieren. (Quelle: Wikipedia)

    Dadurch stellt man sich einfach nur selbst ein Bein.
    Fehler die man nicht mehr sieht, sind trotzdem noch vorhanden.
    Wenn das Skript nicht richtig geht, sucht man sich blöde warum das Skript nicht geht, weil man die Fehlermeldungen nicht mehr sieht.

    Ein Fehler kann auch indirekte folgen haben, deshalb sollte man Fehler in einem Skript möglichst IMMER Ordentlich behandeln (z.B. mit Try{}Catch{}) oder eben durch If(){} vermeiden. Was hier sehr leicht ist!

    Dein Ansatz mit dem If(){} war schon SEHR richtig!

    Um zu testen ob ein Verzeichnis vorhanden ist, kann man das Cmdlet Test-Path benutzen.
    Dieses liefert $True (für Ja ist vorhanden) oder $False (für nein ist nicht vorhanden).

    Beispiel:

    # Testen ob der Pfad C:\windows vorhanden ist
    If(Test-Path -Path 'C:\windows') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\windows ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    } Else {
      # wenn die IF Bedingung $False ergibt, springt der hier in diese Else Klammern {}
      # Else {} kann man auch weglassen!
      Write-Warning 'C:\windows ist NICHT vorhanden!'
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }
    
    # Nochmal ein IF(){} mit einem Pfad der nicht vorhanden ist
    
    # Testen ob der Pfad C:\Ein\Pfad\nach\nirgendwo vorhanden ist
    If(Test-Path -Path 'C:\Ein\Pfad\nach\nirgendwo') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\Ein\Pfad\nach\nirgendwo ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    } Else {
      # wenn die IF Bedingung $False ergibt, springt der hier in diese Else Klammern {}
      # Else {} kann man auch weglassen!
      Write-Warning 'C:\Ein\Pfad\nach\nirgendwo ist NICHT vorhanden!'
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }

    Ich habe oben mit Write-Warning eine Meldung ausgegeben, wenn der Pfad nicht vorhanden ist. Du willst ja keine Meldung, also lass einfach den Else {} Block weg!

    # Testen ob der Pfad C:\windows vorhanden ist
    If(Test-Path -Path 'C:\windows') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\windows ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }
    
    # Nochmal ein IF(){} mit einem Pfad der nicht vorhanden ist
    
    # Testen ob der Pfad C:\Ein\Pfad\nach\nirgendwo vorhanden ist
    If(Test-Path -Path 'C:\Ein\Pfad\nach\nirgendwo') {
      # wenn die IF Bedingung $True ergibt, springt der hier in diese Klammern {}
      
      Write-Verbose 'C:\Ein\Pfad\nach\nirgendwo ist vorhanden! Ich mache was damit.' -verbose
      # mach was hier mit vorhandenem Pfad ... code ...code...
    }

    Um IF(){} zu verstehen lies die gute PowerShell Dokumentation!

    Get-Help about_IF

    oder siehe: http://www.colorconsole.de/PS_Windows/de/about_If.htm


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Dienstag, 7. April 2015 11:37
    • Als Antwort markiert Svensus Mittwoch, 8. April 2015 11:49
    Dienstag, 7. April 2015 05:32
  • Hallo Peter,

    vielen herzlichen Dank für Deine ausführliche Hilfe.

    Du gibst Dir wirklich viel Mühe.

    Übrigens Deine Videos auf Youtube zum Thema PowerShell sind wirklich toll.

    Bearbeite diese gerade mit rauchendem Kopf.

    LG

    Svensus

    Mittwoch, 8. April 2015 11:52