Batch: Wie setzt man den vollständigen Dateinamen einer mit "if exist" und Wildcard-Asterisk gefundenen Datei in eine Variable?
Es soll geprüft werden, ob sich in einem bestimmten Ordner eine Datei wie "GL(2023.05.05).zip" befindet. Die Zahlen im Dateinamen sind nicht bekannt.
"If exist %MEIN_ORDNER%GL(*.*.*).zip" findet die Datei, aber wie kann ich jetzt den tatsächlichen Dateinamen in eine Variable eintragen? Also sowas wie
If exist %MEIN_ORDNER%GL(*.*.*).zip set DATEINAME= ????
2 Antworten
![](https://images.gutefrage.net/media/user/Erzesel/1497339133085_nmmslarge__0_524_1080_1080_4b38ff31970de3b94deb6a27ca8a8f01.jpg?v=1497339133000)
erstmal hast Du eine ganze Menge "Gänsefüßchen" nicht verwendet, was bei Leer-/Sonderzeichenzeichen in Namen/Strings zu Crash von if-Statements (und anderen Kommandos) führt.
dynamische Variablenzuweisungen aus anderen Befehlen erfolgen mit for/f-Loops (gibt's nur in Batch🤢)
For(/r /d) als Dateisuche ist bedingt buggy (auf die Hintergründe und Bedingungen möchte hier nicht eingehen) Verwende for/f in Verbindung mit dir /b oder where macht keinen Ärger.
GL(*.*.*).zip ist nur nötig , wenn auch etwas wie "GL(blub).zip" existieren könnte ist zwar kein Fehler aber in der Regel zuviel des Guten GL(*).zip ist auch gut. (Ein *joker gilt immer bis zum nächsten definierten Zeichen)
syntax für (rekursive) suche mit unterordnern:
where /r "StartOrdner" "dateimaske"
demo.cmd
@echo off
set "ScriptLocation=%~dp0"
set "ScriptLocation=%Scriptlocation:~0,-1%" &rem trailing Backslash/ entfernen (besser für die spätere Verarbeitung)
echo Scriptordner: "%Scriptlocation%" &rem mal anzeigen
rem wenn es nichts zuzuweisen gibt, ist wird der for-Body nie ausgeführt, damit ist dies ein implizites "exist File".
rem eine vorherige prüfung ist nicht nötig
rem where/r durchsucht auch unterordner (ich weiß nicht was Du brauchst)
rem where liefert immer volle Pfade
for /f "tokens=*" %%a in ('where /r "%Scriptlocation%" "GL(*).zip"') do (
set "MyFile.FullName=%%~a" &rem mit Pfad
set "MyFile.Name=%%~nxa" &rem nur Name und Extension
)
set "Myfile." &rem mal angucken
rem jetzt kannst Du prüfen ob die variable gesetzt wurde (ohne erneut auf den datenträger zuzugreifen)
if "%MyFile.FullName%" neq "" (
echo "%MyFile.Name%" gefunden
) else (
echo Nix da!
)
pause
ist nur der direkte Ordnerinhalt gefragt hat where eine andere Syntax:
where "suchordner:Dateimaske"
Demo.cmd
@echo off
set "ScriptLocation=%~dp0"
set "ScriptLocation=%Scriptlocation:~0,-1%"
for /f "tokens=*" %%a in ('where "%Scriptlocation%:GL(*).zip"') do (
set "MyFile.FullName=%%~a"
set "MyFile.Name=%%~nxa"
)
if "%MyFile.FullName%" neq "" (
echo "%MyFile.Name%" gefunden
) else (
echo Nix da!
)
pause
falls mehrere Ergebnisse auftreten könnten kann man aus dem loop-Body auch eine Subroutine aufrufen, welche für alle Funde eine festgelegte Aktion(sfolge) ausführt. (es gibt auch andere Methoden, aber Subroutinen sind "Narrensicher"
demo_sub.cmd
@echo off
set "ScriptLocation=%~dp0"
set "ScriptLocation=%Scriptlocation:~0,-1%"
for /f "tokens=*" %%a in ('where "%Scriptlocation%:GL(*).zip"') do (
call :Was_Fuer_Jeden_Fund_passieren_soll "%%~a" &rem wird nur ausgeführt wen was gefunden wird
)
pause
exit /b
:Was_Fuer_Jeden_Fund_passieren_soll
set "MyFile.FullName=%~1"
set "MyFile.Name=%~nx1"
echo mache irgendwas mit der Datei "%MyFile.Name%"
exit /b &rem zurück in die aufrufende Schleife
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Vielen Dank für die ausführlichen Angaben. Super! Die Anforderungen sind aber in meinem Fall nicht so hoch, und rekursive Suche brauchts nicht. Dafür müssen die 3 Sternchen sein wegen den 2 Punkten im Klammervermerk [für Dateinamen wie z.B. "GL(2023.05.05).zip"]
Nach vielem Ausprobieren ist das Problem jetzt gelöst – zwar nicht so ausgefeilt, funktioniert aber gut:
set MYFILE="GL(*.*.*).zip"
for /f "delims=" %%Z IN ('dir /b /a-d /s %MYFILE%') do (set MYFILE=%%~nZ)
![](https://images.gutefrage.net/media/user/Ginpanse/1715585358313_nmmslarge__0_0_773_772_07dcf7bf365d667c5622cff8de21ebd0.jpg?v=1715585358000)
FOR /R DeinPfad %F in (*.*) do echo %~nF
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Danke. Geht aber leider nicht. Batch stürzt mit dieser Befehlszeile gleich ab.
if exist %SCRIPT_LOCATION%GL(*.*.*).zip FOR /R %SCRIPT_LOCATION%GL(*.*.*).zip %F in (*.*) do echo %~nF
Müll . In Batch sind % für Laufvariablen zu verdoppeln! %%f
for/r ist Buggy!