chkdsk
Goto Top

Doppelte If Anweisung - check if file exist

Hello Again face-smile

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
} 

Content-Key: 593765

Url: https://administrator.de/contentid/593765

Printed on: April 20, 2024 at 11:04 o'clock

Member: TheAggy
TheAggy Aug 05, 2020 updated at 13:17:56 (UTC)
Goto Top
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:
$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
} 
Member: TK1987
TK1987 Aug 05, 2020 at 14:44:15 (UTC)
Goto Top
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.

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...
if ((Test-Path $Path) -and (Test-Path $Path2))

Gruß Thomas
Member: chkdsk
chkdsk Aug 06, 2020 updated at 05:40:45 (UTC)
Goto Top
@chkdsk: Warum dann überhaupt 2 If-Verzweigungen?! Prüf doch gleich, ob beide Dateien vorhanden sind...
if ((Test-Path $Path) -and (Test-Path $Path2))

Gruß Thomas

Hab ich auch schon probiert, allerdings sagt er mir dann gleich "trigger1.txt not exist" obwohl die Datei vorhanden ist. Er geht also gar nicht erst in die erste if Abfrage

$Path = "\\xyz\trigger1.txt"  
$Path2 = "$env:userprofile\xyz\trigger2.txt"  
if ((Test-Path $Path) -and (Test-Path $Path2)){
Member: TK1987
TK1987 Aug 06, 2020 updated at 08:40:46 (UTC)
Goto Top
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 wie
else {
   "$Path oder $Path2 existiert nicht."  
    start-sleep -s 5
} 
stehen.

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.}
  }
Member: chkdsk
chkdsk Aug 06, 2020 updated at 08:42:08 (UTC)
Goto Top
Ich muss mich korrigieren. Ich sehe gerade ich hab in meinem ersten Post etwas falsch erklärt face-sad Sorry für das ganze WirrWarr face-sad BlameOnMe

1. Das Skript startet und überprüft ob Datei 1 vorhanden ist. Ist diese vorhanden, gehts zu Schritt 2. Ist Datei 1 nicht vorhanden soll sich das Skript beenden.
2. Das Skript überprüft ob die Datei 2 vorhanden ist. Ist Datei 2 vorhanden, soll sich das Skript beenden, ist Datei 2 nicht vorhanden gehts weiter zu Schritt 3.
3. Das Skript guckt ob ein Programm X läuft. Falls JA soll es das Programm beenden und Datei 3 in einen Ordner kopieren. Falls Programm X nicht läuft, soll es Datei 3 gleich kopieren.

Ich hoffe ich konnte mich verständlich ausdrücken face-smile
Member: TK1987
TK1987 Aug 06, 2020 at 09:05:20 (UTC)
Goto Top
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?!
Member: chkdsk
chkdsk Aug 06, 2020 at 09:10:32 (UTC)
Goto Top
Ich gucke mir das Skript gleich nochmal an. Vielleicht hab ich die Klammer nur falsch gesetzt.


Zitat von @TK1987:

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

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
Member: TK1987
TK1987 Aug 06, 2020 updated at 09:23:12 (UTC)
Goto Top
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:
if ((Test-Path $Path) -and !(Test-Path $Path2))
Das Ausrufezeichen vor dem 2. Test-Path negiert die Überprüfung.
Member: chkdsk
chkdsk Aug 06, 2020 updated at 09:30:06 (UTC)
Goto Top
Hab ich Tomaten auf den Augen?
Ich habe jetzt folgendes...

$Path = "\\xyz\trigger1.txt"  
$Path2 = "$env:userprofile\xyz\trigger2.txt"  

if ((Test-Path $Path) -and !(Test-Path $Path2)) {   
     
        "trigger1.txt exist"  
        "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
} 

Er Kopiert die Datei in der Copy-Item Anweisung aber trotzdem, auch wenn Trigger 2 vorhanden ist. Aber das soll er ja nicht.
Member: TK1987
TK1987 Aug 06, 2020 updated at 09:39:22 (UTC)
Goto Top
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
}
Member: chkdsk
chkdsk Aug 06, 2020 at 09:53:42 (UTC)
Goto Top
Das Skript lief ohne Fehler. Auch wenn ich die doppelten Klammern wegnehme, kopiert er die Dateien in der Copy-Item Anweisung auch wenn Trigger 2 vorhanden ist. Das Skript soll sich aber beenden.
Member: TK1987
TK1987 Aug 06, 2020 updated at 10:37:08 (UTC)
Goto Top
Dann machst du eindeutig etwas falsch. Habe das Skript welches ich oben gepostet habe getestet - funktioniert genau wie gewünscht.
Member: chkdsk
chkdsk Aug 07, 2020 at 05:35:15 (UTC)
Goto Top
Gerade eben noch einmal getestet. Nachwievor (siehe Skript oben) werden die Dateien im Schritt 3 kopiert, obwohl Trigger 2 vorhanden ist. Ich sehe es live im Explorer am Änderungsdatum der Datei, dass diese nach dem Ausführen des Skripts überschrieben werden.
Member: TK1987
TK1987 Aug 07, 2020 updated at 09:32:07 (UTC)
Goto Top
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...
$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)