2017-01-18 15 views
0

Я работаю с cmd и пытаюсь установить переменную в цикле. Вот код, у меня есть:CMD пытается установить переменную в цикле

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

Я хочу, чтобы искать папку с именем, начинающимся с «резервным копированием» на диск F и сохранить имя этой папки в папке% переменной%. Так, например, если папка будет называться «backup 2017-01-18», я бы хотел, чтобы она была сохранена в var.

Вместо этого он, похоже, ничего не устанавливает, поскольку ECHO просто печатает, что «ECHO включен». Петля for верна, и папка также существует (я уже использую этот фрагмент кода для другой партии с robocopy).

Я мог бы теоретически поместить весь мой код внутри цикла FOR и использовать %% a вместо% folder% var, но это похоже на хакерское решение.

Все решения, которые я нашел до сих пор, указывали на использование EnableDelayedExpansion. Я изменил код, чтобы использовать его так:

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

Но теперь ECHO печатает "! Папку!" как если бы он не обнаружил переменную. Если я вернусь к папке ECHO%%, я снова узнаю, что «ECHO включен».

EDIT: Я нашел здесь проблему. Я также запускал другой пакетный файл в папке резервного копирования. Оказывается, ROBOCOPY (который я использовал в этой партии) устанавливает закрывающую папку скрытой, системной и readonly по умолчанию (даже если скопированные файлы не скрыты или система o_0). Когда я удалил атрибуты HSR в каталоге, код, отправленный здесь, начал работать нормально (исходная версия).

+0

Является ли этот набор коды внутри другого блока кода? Ваш первый набор кода отлично подходит для меня сам. – Squashman

+0

Нет, это весь пакетный файл, который я запускаю вручную. – ilozen

+0

Тогда F: \ backup * не существует. – Squashman

ответ

1

Если ваш цикл for /d %%a in ("F:\backup*") do не обнаруживает каких-либо каталогов, имена которых начинаются с backup, они либо не существуют, либо есть атрибуты скрытые и/или систему набор.

Для обнаружения также таких скрытых или системных каталогов, заменить петлю for /D этим:

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