Doppelte If Anweisung - check if file exist
Hello Again
Ich habe hier ein Skript, welches zu zu Beginn überprüft ob eine Datei vorhanden ist. Falls ja, soll im Nächsten Schritt überprüft werden, ob eine andere Datei vorhanden ist. Falls ja soll weiter gemacht werden. Ist die zweite Datei nicht vorhanden, soll das Skript beenden, genauso wenn die erste Datei nicht vorhanden ist.
Im Anhang mein Skript. Es läuft sauber durch, wenn ich die zweite check if file exist Anweisung raus nehme. Habe ich eine Klammer falsch gesetzt?
Ich habe hier ein Skript, welches zu zu Beginn überprüft ob eine Datei vorhanden ist. Falls ja, soll im Nächsten Schritt überprüft werden, ob eine andere Datei vorhanden ist. Falls ja soll weiter gemacht werden. Ist die zweite Datei nicht vorhanden, soll das Skript beenden, genauso wenn die erste Datei nicht vorhanden ist.
Im Anhang mein Skript. Es läuft sauber durch, wenn ich die zweite check if file exist Anweisung raus nehme. Habe ich eine Klammer falsch gesetzt?
$Path = "\\xyz\trigger1.txt"
if (Test-Path $Path){
"trigger1.txt exist"
$Path2 = "$env:userprofile\xyz\trigger2.txt"
if (test-Path $Path2)
"trigger2.txt exist"
if((get-process "XXX" -ea SilentlyContinue) -eq $Null){
"not Running"
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
else
{
"running"
stop-process -name "XXX" -force
start-sleep -s 5
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
}
else
{
"trigger1.txt not exist"
start-sleep -s 5
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 593765
Url: https://administrator.de/contentid/593765
Ausgedruckt am: 21.11.2024 um 18:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo chkdsk,
dir fehlt in Zeile 6 die zu öffnende Klammer nach dem if und dadurch eine schließende vor dem ersten else, wenn ich es richtig gesehen habe. Als kleinen Tipp um solche Fehler zu vermeiden sind Einrückungen zu verwenden. Könnte Beispielsweise dann so ausehen:
dir fehlt in Zeile 6 die zu öffnende Klammer nach dem if und dadurch eine schließende vor dem ersten else, wenn ich es richtig gesehen habe. Als kleinen Tipp um solche Fehler zu vermeiden sind Einrückungen zu verwenden. Könnte Beispielsweise dann so ausehen:
$Path = "\\xyz\trigger1.txt"
if (Test-Path $Path){
"trigger1.txt exist"
$Path2 = "$env:userprofile\xyz\trigger2.txt"
if (test-Path $Path2)
{
"trigger2.txt exist"
if((get-process "XXX" -ea SilentlyContinue) -eq $Null)
{
"not Running"
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
}
else
{
"running"
stop-process -name "XXX" -force
start-sleep -s 5
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
}
else
{
"trigger1.txt not exist"
start-sleep -s 5
}
Moin,
@TheAggy: jetzt hast du aber dafür den else-Befehl mit dem "running" falsch gesetzt, der gehört laut dem TO zu dem If-Befehl eine Ebene drunter.
Gruß Thomas
@TheAggy: jetzt hast du aber dafür den else-Befehl mit dem "running" falsch gesetzt, der gehört laut dem TO zu dem If-Befehl eine Ebene drunter.
Zitat von @chkdsk:
Falls ja soll weiter gemacht werden. Ist die zweite Datei nicht vorhanden, soll das Skript beenden, genauso wenn die erste Datei nicht vorhanden ist.
@chkdsk: Warum dann überhaupt 2 If-Verzweigungen?! Prüf doch gleich, ob beide Dateien vorhanden sind...Falls ja soll weiter gemacht werden. Ist die zweite Datei nicht vorhanden, soll das Skript beenden, genauso wenn die erste Datei nicht vorhanden ist.
if ((Test-Path $Path) -and (Test-Path $Path2))
Gruß Thomas
Zitat von @chkdsk:
Hab ich auch schon probiert, allerdings sagt er mir dann gleich "trigger1.txt not exist" obwohl die Datei vorhanden ist.
Weil die else-Anweisung dann auch falsch definiert ist. Er springt dann zu else, wenn $Path oder $Path2 nicht existieren, also muss in else auch etwas wieHab ich auch schon probiert, allerdings sagt er mir dann gleich "trigger1.txt not exist" obwohl die Datei vorhanden ist.
else {
"$Path oder $Path2 existiert nicht."
start-sleep -s 5
}
Wenn du hingegen anzeigen willst, welche Datei genau fehlt, würde ich hier einen noch anderen Ansatz wählen:
$Files = @(
'C:\Test\Datei1.txt'
'C:\Test\Datei2.txt'
)
$TestResult = Test-Path $Files
if ($TestResult -NotContains $false) {
# Alle Dateien existierten
}
else {
$TestResult | sls $false | %{write-host -f red $Files[($_.Linenumber-1)] existiert nicht.}
}
Schon klar - und genau dafür hat dir @TheAggy ja schon die Lösung gepostet. Du muss da nur wie bereits erwähnt die zweite else-Anweisung wieder an den richtigen Platz schieben. Sprich Zeile 17 runter schieben hinter Zeile 26.
Aber genau das ist der Punkt, an dem ich mein Verständnisproblem habe: Schritt 1 und Schritt 2 machen vom Prinzip her genau das selbe - wieso also nicht die Effizienz erhöhen, indem man das Ganze zu einem einzigen Schritt zusammenfügt?!
Aber genau das ist der Punkt, an dem ich mein Verständnisproblem habe: Schritt 1 und Schritt 2 machen vom Prinzip her genau das selbe - wieso also nicht die Effizienz erhöhen, indem man das Ganze zu einem einzigen Schritt zusammenfügt?!
Zitat von @chkdsk:
Das Problem ist ja, dass wenn Datei 1 und Datei 2 nicht vorhanden sind, das Skript beendet wird. Er soll aber zu Schritt 3 springen wenn Datei 2 nicht vorhanden ist
Na in dem Fall:Das Problem ist ja, dass wenn Datei 1 und Datei 2 nicht vorhanden sind, das Skript beendet wird. Er soll aber zu Schritt 3 springen wenn Datei 2 nicht vorhanden ist
if ((Test-Path $Path) -and !(Test-Path $Path2))
Zeigt der keinen Fehler an?! Du hast eine schließende Klammer (Zeile 16) zu viel. Die Else-Anweisung gehört ja zu dem zweiten If-Befehl.
$Path = "\\xyz\trigger1.txt"
$Path2 = "$env:userprofile\xyz\trigger2.txt"
if ((Test-Path $Path) -and !(Test-Path $Path2)) {
"trigger1.txt exist"
"trigger2.txt not exist"
if((get-process "XXX" -ea SilentlyContinue) -eq $Null)
{
"not Running"
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
else
{
"running"
stop-process -name "XXX" -force
start-sleep -s 5
copy-item "\\xyz\xyz\*" "$env:userprofile\def\" -recurse -ErrorAction SilentlyContinue
start-sleep -s 5
Start-Process -filepath "C:\Program Files (x86)\mno\XXX.exe"
}
}
else
{
"trigger1.txt not exist"
start-sleep -s 5
}
Nachwievor: Dann machst du etwas falsch!
Du hast doch eine Konsole - ist nicht so schwer ein paar Tests durchzuführen, um zu überprpüfen, wo bei dir der Fehler liegt. Pfadangabe falsch, sodass die Datei doch nicht existiert... etc
Oder man macht es zur Not halt für ganz blöde und schreibt das Skript so um, dass es nichts weiter tut, als einem anzuzeigen, wann welcher Fall eintritt...
Du hast doch eine Konsole - ist nicht so schwer ein paar Tests durchzuführen, um zu überprpüfen, wo bei dir der Fehler liegt. Pfadangabe falsch, sodass die Datei doch nicht existiert... etc
Oder man macht es zur Not halt für ganz blöde und schreibt das Skript so um, dass es nichts weiter tut, als einem anzuzeigen, wann welcher Fall eintritt...
$Path = "\\xyz\trigger1.txt"
$Path2 = "$HOME\xyz\trigger2.txt"
if ((Test-Path $Path) -and !(Test-Path $Path2)) {
write-host -f green "Trigger1 existiert.`nTrigger2 existiert nicht."
if(!(get-process "XXX" -ea SilentlyContinue)) {
write-host -f red "Es läuft kein Prozess 'XXX'"
}
else {
write-host -f green "Prozes 'XXX' läuft."
}
}
else {
if (!(Test-Path $Path)) {write-host -f red "Das Skript wird beendet, weil Trigger1.txt nicht existiert."}
if (Test-Path $Path2) {write-host -f red "Das Skript wird beendet, weil Trigger2.txt existiert."}
}
write-host -n "Ende des Skripts. Beliebige Taste zum Beenden... "
[void][console]::ReadKey($true)