Batch Was tut diese Tilde - For %%a in (…) / %%~a

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
18.346
Moin & frohe Weihnachten.

Den (solchen) Code benutze ich einige Jahre schon, habe mir aber nie Gedanken gemacht…
Code:
@echo off
setlocal enabledelayedexpansion
set TD=%~d0
set SD=K
for %%a in ("Eigene Dateien" "Eigene Dateien Keller") do robocopy "%SD%:\%%~a" "%TD%\%%~a" /mir /w:0 /r:0 /maxage:100
set SD=I
for %%a in ("My Files" Multimedia  do robocopy "%SD%:\%%~a" "%TD%\%%~a" /mir /w:0 /r:0 /maxage:100
endlocal

Das Setlocal scheint überflüssig. set TD=%~d0 (Target Drive) ist für den Stick gedacht den ich einstecke und darauf die Batch anwerfe. WIN kann sich Lettern ja einfach nicht merken, auf Tools verzichte ich.

Warum aber muss es %TD%\%%~a heißen? %TD%\%%a funktioniert nicht weil »nichts erkannt würde«, und das Ist gewiss das Ergebnis von Herumprobieren.
Bei uraltem Code hatte ich da nur mit einer Tilde was zu tun. Ich werd’ wuschig…

CN8
 
cumulonimbus8 schrieb:
Das Setlocal scheint überflüssig.
Ist es in Deinem Code auch. Das benötigt man nur, wenn man innerhalb einer Schleife einer Variablen einen Wert zuweisen will.

cumulonimbus8 schrieb:
Warum aber muss es %TD%\%%~a
Die Tilde entfernt umschließende Anführungszeichen ... ohne sie hättest Du bei Deinem Code falsch gesetzte Anführungszeichen
 
  • Gefällt mir
Reaktionen: areiland
Ah, danke. :)
Die Anführungszeichen also, die ich in der Klammer brauche um Leerzeichen an die Leine zu nehmen.
Da frage ich mich glatt wo das wieder in der Hilfe zu FOR versteckt ist.

SetLocal hatte ich drin gelassen um es wegkopieren zu können, ›enabledelayedexpansion‹ kann ich mir nicht merken… ;)

CN8
 
Setlocal setzt Variablen auf scriptlokal. Deswegen heißt es so. Ohne setlocal werden vorhanden globale Umgebungsvariablen geändert, allerdings nur in der jeweiligen Instanz des Befehlsprozessors sowie den Prozessen, die von dort gestartet werden.
enabledelayedexpansion als Flag zu setlocal ist zwar hier nicht erforderlich, schadet aber auch nicht.
 
Zurück
Oben