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
.
person
MC ND
schedule
28.11.2014