2017-01-18 5 views
0

Ich arbeite mit Windows 'cmd und versuche, eine Variable in einer Schleife zu setzen. Hier ist der Code, den ich habe:CMD versucht Variable in einer Schleife zu setzen

for /d %%a in ("F:\backup*") do set folder=%%a 
ECHO %folder% 
PAUSE 

ich für einen Ordner mit dem Namen mit „backup“ auf Laufwerk F beginnen aussehen will und die Ordnernamen zu% Ordner% Variable speichern. Wenn zum Beispiel der Ordner "backup 2017-01-18" heißen würde, würde ich das gerne in einem var speichern.

Stattdessen scheint es nichts zu setzen, da ECHO nur druckt, dass "ECHO an ist". Die for-Schleife ist korrekt und der Ordner ist auch da (ich verwende diesen Code bereits für andere Stapel mit Robocopy).

Ich könnte theoretisch meinen gesamten Code in die FOR-Schleife setzen und %% anstelle des% -Ordners% var verwenden, aber das scheint eine hacky Lösung zu sein.

Alle Lösungen, die ich bisher gefunden habe, verweisen auf EnableDelayedExpansion. Ich änderte den Code, um es so zu verwenden:

Setlocal EnableDelayedExpansion 
for /d %%a in ("F:\backup*") do set folder=%%a 
ECHO !folder! 
PAUSE 

Aber jetzt druckt ECHO "! Ordner!" als würde es die Variable nicht erkennen. Wenn ich zu ECHO% folder% zurückkomme, lerne ich noch einmal, dass "ECHO an ist".

EDIT: Ich habe das Problem hier gefunden. Ich habe auch eine andere Batch-Datei im Backup-Ordner ausgeführt. Es stellt sich heraus, dass ROBOCOPY (das ich in diesem Stapel verwendete) den umschließenden Ordner standardmäßig auf versteckt, system- und schreibgeschützt setzt (auch wenn kopierte Dateien nicht versteckt sind oder System o_0). Als ich HSR-Attribute auf dem Verzeichnis entfernte, begann der Code, der hier gepostet wurde, gut (die anfängliche Version).

+0

Ist dieser Satz von Code in einem anderen Codeblock? Ihr erster Satz Code funktioniert für mich ganz gut. – Squashman

+0

Nein, dies ist die gesamte Stapeldatei, die ich manuell ausführe. – ilozen

+0

Dann ist F: \ backup * nicht vorhanden. – Squashman

Antwort

1

Wenn Ihre Schleife for /d %%a in ("F:\backup*") do erkennt keine Verzeichnisse, deren Namen mit backup, sie entweder nicht existieren oder es sind die Attribute versteckt und/oder System Set.

Um auch solche versteckten oder Systemverzeichnisse, ersetzen Sie die for /D Schleife durch diese erkennen:

rem Change to parent directory "F:\" temporarily in order for the `~f` modifier to resolve the full path properly: 
pushd "F:\" || exit /B 1 
for /F "eol=| delims=" %%D in ('dir /B /A:D /O:N "backup*"') do set "folder=%%~fD" 
popd 
Verwandte Themen