Batch: Wie setzt man den vollständigen Dateinamen einer mit "if exist" und Wildcard-Asterisk gefundenen Datei in eine Variable?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
josk45 
Fragesteller
 07.05.2023, 21:57

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)

1
FOR /R DeinPfad %F in (*.*) do echo %~nF
Woher ich das weiß:Berufserfahrung – Backend Developer
josk45 
Fragesteller
 05.05.2023, 15:25

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

0
Erzesel  07.05.2023, 12:47

Müll . In Batch sind % für Laufvariablen zu verdoppeln! %%f

for/r ist Buggy!

1