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
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
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)
FOR /R DeinPfad %F in (*.*) do echo %~nF
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!