Benutzer mit den meisten Antworten
Arbeiten mit IF-Bedinugen

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 .jpgJetzt 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
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
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
- Als Antwort markiert Svensus Montag, 6. April 2015 23:02
- Bearbeitet tonibert Dienstag, 7. April 2015 12:03
- Tag als Antwort aufgehoben Denniver ReiningMVP, Moderator Mittwoch, 8. April 2015 12:16
-
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