batch file: if Ordner oder Datei ist vorhanden, dann call

tomm1984

Lt. Junior Grade
Registriert
Juni 2016
Beiträge
332
Hallo geschätztes Forum,

ich bräuchte bitte Hilfe bei If-Bedingungen in cmd / batch. Sinngemäß möge die Meta-Batch-File zuerst prüfen, ob ein bestimmter Ordner oder eine bestimmte Datei darin vorhanden ist (was geprüft wird, ist eigentlich egal, da beides - zumindest stelle ich das manuell sicher - Hand in Hand geht: ist der Ordner da, dann ist auch die Datei da (sollte zumindest ;) )). Ist dies der Fall, dann soll eine bestimmte batch-File ausgeführt werden (call); falls nicht, gehe zum nächsten Schritt.

Die Ordnernamen habe keine Logik, dass man einfach hochzählen etc. könnte; ich muss die alle einmal händisch definieren.

Code:
set folder01=D:\folder01\
set file01=file01.bat

set folder02=D:\folderABC\
set file02=fileXYZ.bat



if
    %folder01% = exists
then
    call %folder01%%file01

if
    %folder02% = exists
then
    call %folder02%%file02

Danke für jeden Support!
 
Ich würde das nicht als Batch machen. Powershell ist für sowas wesentlich sinnvoller. Ich habe hier mal ganz kurz was zusammengeklöppelt:

PowerShell:
$folders = get-content C:\Folderliste.txt

foreach ( $folder in $folders ){
    if (!(Test-Path $folder)){
        start-process $folder\file.cmd
    }
}

Du musst hier nur die Folderliste.txt pflegen. Falls die cmd-Datei in jedem Ordner anders bennant ist, kann man das erweitern.
 
hmm, okay. ich verstehe, dass PS sinnvoller ist ... würde ich dann so umsetzen.
Und ja, der Dateiname kann vom Ordnernamen abweichen. Darf ich freundlich fragen, wie das dann aussehen würde? ...sowohl in der Folderliste.txt (finde, btw, eine elegante Löstung) als auch in der .ps1?

Soweit erstmal vielen Dank.
 
nee, nicht zwangsläufig. könnte ich aber einrichten ... wäre dann übrigens auch eine .ps1
also, ich sag mal fix "ja" :)
 
So würds aussehen, wenn es nur eine cmd-Datei je Ordner gibt:

Folderliste:
Code:
D:\Test
D:\Test2
D:\Test3
D:\Test5555
D:\Test9
D:\Test6

Folder.ps1, wenn cmd gestartet wird:
PowerShell:
$folders = get-content C:\Temp\Folderliste.txt

foreach ( $folder in $folders ){
    if (!(Test-Path $folder)){
        $file = Get-ChildItem $folder -Filter "*.cmd"
        start-process "$folder\$file"
    }
}

Folder.ps1, wenn eine ps1 gestartet wird:
PowerShell:
$folders = get-content C:\Temp\Folderliste.txt

foreach ( $folder in $folders ){
    if (!(Test-Path $folder)){
        $file = Get-ChildItem $folder -Filter "*.ps1"
        & "$folder\$file"
    }
}

Das funktioniert jeweils aber nur, wenn es wirklich nur EINE cmd oder ps1 Datei in dem jeweiligen Ordner gibt. Der Code ist zudem nur Quick'n'Dirty zusammengeschrieben, also bitte vorher testen :-)
 
@Rego
so, ich habe jetzt mal meine batchs auf ps1 umgeschrieben und mich wieder der meta-ps1 gewidmet.
irgendwie greift die "meta-file" noch nicht die ps1-files die in den Ordnern der Folderliste gefunden wurden.


was hat es mit diesem Testpfad auf sich?
1677105311668.png
 
So ohne Kaffee Mal aus dem Kopf:

Das test-path prüft ob der Pfad aus $folder existiert und gibt den entsprechenden boolean Wert false oder true zurück.
Die If schleife prüft somit ob der Pfad existiert.
Das ! Wandelt den Ergebniswert um, also aus true wird false.

Wenn ich das jetzt richtig im Kopf zusammensetzen, so sollte das ! Im If Teil weg, damit er die weitere Prüfung bei Existenz des Ordners auch macht, sonst würde er nichts tun.

Eventuell bin ich aber noch nicht richtig wach
 
@tomm1984
Du hast doch schon wieder mehr vor als du verrätst. ;)

Gut gemeinter Vorschlag, anstatt irgendwelche Dateien in irgendwelchen Ordnern zu suchen.
  • Verstehe wie du dir ein eigenes Modul aufbaust
  • Verstehe wie du das einbindest
  • Baue deine scheinbar vielzähligen Scripte als parametrisierte Cmdlets und lege die ins Modul
  • Baue Scripte ausschließlich um vorgefertigte Aufgaben für Cmdlets zu starten die Parameter benötigen.
Wie du das aufbauen kannst, kannst du dir in meinem Modul anschauen - und gerne verbessern wenn da was doof ist. Da ist auch eine PDF drin die alle Schritte haarklein erklärt.
https://imaginado.de/downloads/
 
  • Gefällt mir
Reaktionen: tomm1984
@rsfb : okay, klingt schlüssig; ich vermutete, dass "Test-Path" ein Überbleibsel ist; nicht, dass es ein cmdlet ist. Danke für die kaffeelosen Gedanken und Ausführungen. Hmm, dann macht das ! wohl doch Sinn, damit der Wahrheitswert gegen $folder laufen kann und die If-Prüfung erfüllt oder nicht ... :-/

@morcego : besten Dank für den Hinweis und den Rat; i.d.R. brennen mir solche Themen unter den Nägeln und ich will da - dank wertvoller Hilfen im Forum hier - einen Haken dranbekommen und dann fange ich an zu verstehen und zu verbessern.

Das aktuelle Arbeitsskript tut . (party) ...es sieht grottig aus, ich habe mich da ein wenig mit den Variablen verzettelt und werde es kurzfristig aufräumen, aber es tut (party 2.0). Jetzt wollte ich lediglich dieses Arbeitsskript in jeden revelanten Ordner packen, die Folderliste.txt pflegen (mit jenen Pfaden, die nach einer *.ps1 durchsucht werden sollen, die dann auch ausgeführt werden) und nur noch die meta.ps1 anstoßen.
Ergänzung ()

...auf die Schnelle habe ich das jetzt erstmal über (m)eine Batch gelöst und packe dort einfach all die Pfade zu den .ps1-Files rein - wird ein Ordner / eine ps1 nicht gefunden, so merckert zwar cmd, aber geht einfach zu nächsten Eintrag ... und damit ist - sofern ich die Pfade richtig pflege (selbes "Problem" hätte ich ja auch bei der folderlist.txt) - gegeben, dass die PS-Skripte für alle Ordner ausgeführt werden, die da sind.
 
Zuletzt bearbeitet:
Das ist ja ok wenn du Sachen fertig bekommen willst. Nur, wenn man Geschäftigkeit vortäuscht indem man irgendwas hinfrickelt, ist das nicht wirklich sinnvoll. Wenn du anfängst irgenwelche Programmierlogik über das Netzwerk zu verteilen, verlierst du vollständig die Kontrolle. Nicht nur welche Version gerade aktuell ist, auch wo es überhaupt landet. Das ist gelinde gesagt Bockmist. Deshalb der ernstgemeinte Rat das zentral zu organisieren.
Das was generisch zu tun ist in deinem "Arbeitsskript" ist ein Cmdlet alla Set-WeirdStuff - Path <Folderpath>
und in einem Sammelscript was dann auch zentral liegt existiert eine Liste die dann per foreach oder von mir aus auch Pipeline die Ordner durchgeht und an das Cmdlet weitergibt..
Code 1x haben, nicht unbekannt oft.

Und die Versionierung dann per Git Repository damit man überhaupt ne Chance hat was nachzuvollziehen.
Wenn dir Sachen unter den Nägeln brennen, wieso dann nicht die sinnvolle Struktur und Deployment von PS in größeren Umgebungen. ;)
 
  • Gefällt mir
Reaktionen: tomm1984
@morcego : volle Zustimmung! genau die Probleme sehe ich auch ... allerdings ist das bei Weitem nicht so groß oder so professionell (ganz offensichtlich :-D) wie Du es vermutlich vermutest; ich verstehe und akzeptiere, dass es für viele Dinge professionelle Ansätze und Lösungen gibt, doch ich finde der Kontext spielt eben auch eine Rolle, gemäß Redensart "mit Kanonen auf Spatzen zu schießen" ... und hier reicht mir halt "good enough" ... sollte das Thema weiter in die Breite gehen, dann sind mindestens genau die Schritte notwendig und sinnvoll, die Du angesprochen hast ... und vielleicht führt das sogar noch weiter, dass nämlich der gesamte Ansatz und wiederum dessen Zweck hinterfragt werden könnte / sollte / müsste.

Im Ernst: Vielen Dank für die wertschätzende Rückmeldung; viel Wahres dran.
 
Das geht auch als CMD, direkter an deine Wünsche angelehnt:

Code:
set "path01=D:\folder01\file01.bat"
set "path02=D:\folderABC\fileXYZ.bat"

call :ExecutePath "%path01%"
call :ExecutePath "%path02%"
exit /b 0

:ExecutePath
if not exist %1 (
  echo Error:   File %1 not found.
  exit /b 1
)
call %1
exit /b 0

Das Script ist nicht getestet, sollte aber mit Pfaden, die Leerzeichen enthalten, klar kommen.
 
Zurück
Oben