hacktrist
Goto Top

Powershell: Beenden in If Anweisung ohne das Fenster zu schließen

Hallo,

ich möchte einen Ordner auf den Inhalt von xml files prüfen.
if (!(Test-Path "I:\AppsProj\EMSY\S_322\Transfer\488_ERS\2020\*.xml"))  
{ 
    Write-Host "Es sind keine XML Datein zur Verarbeitung vorhanden." -ForegroundColor Red  
}

Sind keine XML Files enthalten soll der Text wie Oben eingeblendet werden und das Script an der stelle abgebrochen werden.
Jedoch soll sich das PowerShell Fenster nicht schließen, damit der Nutzer die Fehlermeldung lesen kann.

Ich habe mich bereits belesen und wenn ich ein einfaches
Exit
einfüge wird wohl auch das Fenster geschlossen.

Irgendwelche Tipps?

Content-Key: 666919

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

Printed on: April 25, 2024 at 06:04 o'clock

Member: Nebellicht
Nebellicht May 20, 2021 updated at 07:34:44 (UTC)
Goto Top
Hallo Hacktrist,
guck mal hiermit müßte es gut klappen:
PAUSE
und folgendes gefunden:
Start-Sleep 10000

Gruß Nebellicht
Member: Hacktrist
Hacktrist May 20, 2021 at 07:36:12 (UTC)
Goto Top
Wenn ich
PAUSE
einfüge wird dem Nutzer der Text wie gewünscht angezeigt. Jedoch hat er dann folgende Einblendung:
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:

Das soll aber wenn möglich nicht sein, da der weitere Code dinge ausführt die sowieso nicht funktionieren.
Mitglied: 148121
Solution 148121 May 20, 2021 updated at 07:43:46 (UTC)
Goto Top
Read-Host
return
in die IF einfügen und PS Skript mit Parameter -NoExit starten
Bzw. Das Read-Host vor das Return setzen wenn nach Enter beendet werden soll.
Member: Hacktrist
Hacktrist May 20, 2021 at 07:42:36 (UTC)
Goto Top
Hi @148121

das Skript mit einem Parameter zu starten ist leider nicht möglich, da das Script ständig an neue Kollegen weiter gegeben werden soll.

Aber wenn ich deine andere Lösung verwende, funktioniert es und das Script beendet sich bei betätigen der ENTER Taste
# Check, ob im Ordner "I:\AppsProj\EMSY\S_322\Transfer\488_ERS\2020" neue XML Files enthalten sind 
if (!(Test-Path "C:\Arbeitsordner\Testordner\*.xml"))  
{ 
    Write-Host "Es sind keine XML Datein zur Verarbeitung vorhanden." -ForegroundColor Red  
    Read-Host
return
}

Kann ich das so verwenden?
Mitglied: 148121
148121 May 20, 2021 at 07:43:14 (UTC)
Goto Top
Jepp so war's gedacht
Member: Doskias
Doskias May 20, 2021 at 07:43:52 (UTC)
Goto Top
Alternativ mach doch einfach:
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
if (!(Test-Path "I:\AppsProj\EMSY\S_322\Transfer\488_ERS\2020\*.xml"))  
{ 
    [System.Windows.Forms.MessageBox]::Show("Es sind keine XML Datein zur Verarbeitung vorhanden.","Keine Daten vorhanden",0)  
}
Mitglied: 148121
148121 May 20, 2021 updated at 07:46:20 (UTC)
Goto Top
Zitat von @Doskias:

Alternativ mach doch einfach:
> 
> [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
> if (!(Test-Path "I:\AppsProj\EMSY\S_322\Transfer\488_ERS\2020\*.xml"))  
> { 
>     [System.Windows.Forms.MessageBox]::Show("Es sind keine XML Datein zur Verarbeitung vorhanden.","Keine Daten vorhanden",0)  
> }
> 
Dann brauchst du trotzdem noch ein "Return" wenn nachfolgende Schritte nicht abgearbeitet werden sollen , oder man packt den Rest stattdessen in den else Teil.
Member: Hacktrist
Hacktrist May 20, 2021 at 07:50:49 (UTC)
Goto Top
Beides Super Lösungen.
Ich werde @148121 Lösung nehmen.

Dankeschön.
Member: Doskias
Solution Doskias May 20, 2021 updated at 08:30:59 (UTC)
Goto Top
Zitat von @148121:
Dann brauchst du trotzdem noch ein "Return" wenn nachfolgende Schritte nicht abgearbeitet werden sollen , oder man packt den Rest stattdessen in den else Teil.

Das stimmt, aber genau dafür gibt es IF ja schließlich. Wenn ich keine Daten zum verarbeiten habe, darf der Teil natürlich nicht im IF-Teil stehen, sondern gehört in den Else teil. Wenn ich in einer IF-Anweisung das Skript beenden muss, dann hab ich das Konzept an sich noch nicht verstanden.

Also in dem Fall
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
if (!(Test-Path "I:\AppsProj\EMSY\S_322\Transfer\488_ERS\2020\*.xml"))  
{ 
# Hier den Code, der ausgeführt wird, wenn die Bedingung erfüllt ist, also keine Datei vorliegt
    [System.Windows.Forms.MessageBox]::Show("Es sind keine XML Datein zur Verarbeitung vorhanden.","Keine Daten vorhanden",0)  
}
else
{
# Hier den Code hin der ausgeführt wird, wenn eine XML-Datei vorliegt
}

Ergebnis: man baucht kein Exit und bekommt eine Meldung, wenn keine Daten vorliegen.
Mitglied: 148121
148121 May 20, 2021 updated at 08:18:58 (UTC)
Goto Top
Wenn ich in einer IF-Anweisung das Skript beenden muss, dann hab ich das Konzept an sich noch nicht verstanden.
Es gibt einige Gründe für solche Konstrukte mit Return um z.B. ein unendliches Verschachteln von IF-Abfragen zu vermeiden face-wink.
So kann man den Code "flach" halten ohne das die Einrückungen im schlimmsten Falls so weit aus dem Fenster wandern das man die Übersicht verliert.

Alternativ baut man ein Try Catch um die Aktionen und wirft bei einem selbst erkannten Fehler ne Exception mit throw 'BlaBlub Error' und springt damit automatisch in den Catch-Teil und überspringt den Rest des produktiven Skripts.

Viele Wege führen nach Rom.
Member: Doskias
Doskias May 20, 2021 at 08:30:50 (UTC)
Goto Top
Zitat von @148121:
Wenn ich in einer IF-Anweisung das Skript beenden muss, dann hab ich das Konzept an sich noch nicht verstanden.
Es gibt einige Gründe für solche Konstrukte mit Return um z.B. ein unendliches Verschachteln von IF-Abfragen zu vermeiden face-wink.
Verschachteln von IF-Abfragen ist schon so eine Sache, da hast du recht. Die versuche ich auch zu vermeiden. Allerdings würde ich dabei dann eher auf das Else verzichten oder mit neuen Hilfsvariablen arbeiten.

So kann man den Code "flach" halten ohne das die Einrückungen im schlimmsten Falls so weit aus dem Fenster wandern das man die Übersicht verliert.
Das ist das schlimmste nach dem goto Befehl face-smile

Alternativ baut man ein Try Catch um die Aktionen und wirft bei einem selbst erkannten Fehler ne Exception mit throw 'BlaBlub Error' und springt damit automatisch in den Catch-Teil und überspringt den Rest des produktiven Skripts.
Finde ich besser als Mittels IF-Anweisung das Skript zu verlassen

Viele Wege führen nach Rom.
Es geht nicht um den Weg nach Rom, sondern darum wie man auf dem Weg dahin sitzt face-wink
Member: joehuaba
joehuaba May 20, 2021 at 08:35:33 (UTC)
Goto Top
Hallo face-smile

Hier 5 Möglichkeiten für dich:
https://www.itnator.net/eine-pause-in-powershell-script-verwenden/

Gruß joehuaba
Member: Nebellicht
Nebellicht May 20, 2021 updated at 10:07:51 (UTC)
Goto Top
Zitat von @Hacktrist:

Wenn ich
PAUSE
einfüge wird dem Nutzer der Text wie gewünscht angezeigt. Jedoch hat er dann folgende Einblendung:
Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:

Das soll aber wenn möglich nicht sein, da der weitere Code dinge ausführt die sowieso nicht funktionieren.

o.k. nach PAUSE käme ja dann Dein EXIT. face-wink

pause
exit
Member: Hacktrist
Hacktrist May 20, 2021 at 10:58:47 (UTC)
Goto Top
o.k. nach PAUSE käme ja dann Dein EXIT. face-wink

pause
 exit

Ahh Verstehe face-smile