for %a in (*) do (set tmpx=%a & echo %tmpx%)
Проблема с предыдущим кодом задерживается расширение. Да, вы включили его, но вы его не использовали, и в зависимости от того, как вы включили его, он не будет работать.
В cmd
, когда достигается линия или блок строк (код внутри скобок), это первый анализируется, а затем выполняется. Во время фазы анализа операции чтения переменных удаляются из команды, заменяются значением в переменной до, когда команда начинает выполняться. Таким образом, если вы изменяете значение переменной внутри строки/блока, вы не можете получить измененное значение внутри той же строки/блока, что и переменные считаются (они были заменены)
setlocal enabledelayedexpansion
позволяет заменить (при необходимости)) синтаксис чтения переменных от %var%
до !var!
, указывая парсеру, что операция чтения будет отложена до этапа выполнения.
Таким образом, в вашем случае, ваш код должен был что-то вроде
setlocal enabledelayedexpansion & for %a in (*) do (set "tmpx=%a" & echo !tmpx!)
, но это не будет работать (в стандартных настроенных средах).
cmd
имеет два режима исполнения: командный файл и командную строку. В вашем случае вы используете командную строку (без пробела знак процента в цикле for
), а в режиме командной строки setlocal enabledelayedexpansion
не будет работать. Он предназначен для пакетных файлов (см. setlocal /?
)
Как заставить его работать из командной строки?По умолчанию cmd
запущен с задержкой расширения отключен, и вы не можете включить его, если не внутри пакетного файла. Но вы можете начать cmd
с замедленным расширением включены и запустить команду в этом начало экземпляр (см cmd /?
)
cmd /v:on /c "for %a in (*) do (set "tmpx=%a" & echo !tmpx!)"
Во всяком случае, чтобы решить вашу проблему переименования, замедленное расширение не требуется
for %a in (*_*.tif) do for /f "tokens=1,* delims=_" %b in ("%~nxa") do echo ren "%a" "%c"
То есть , для каждого файла tif
с символом подчеркивания возьмите имя и расширение файла (%~nxa
) в качестве строки и используя знак подчеркивания в качестве разделителя между токенами, извлеките первый токен (текст слева от первого подчеркивания) в %b
, а остальная часть текста (справа от символа подчеркивания) на %c
. Теперь просто переименуйте исходное имя файла (хранящееся в %a
) в содержимое %c
(текст справа от символа подчеркивания).
В этом режиме операции переименования кода отображаются только в консоли. Если выход правильный, удалите команду echo
.
Возможный дубликат [Пакетный файл переименования с использованием цикла] (http://stackoverflow.com/questions/19453995/batch-rename-file-using-for-loop) – DavidPostill