2014-11-27 3 views
0

Я над головой с этим - потратил слишком много времени на поиск уже - очевидно, я не понимаю основ CMD-переменных и т. Д. - и это всегда дает мне такую ​​головную больcmd for loop mass renaming again oneliner

Почему бы не работать?

for %a in (*) do (set tmpx=%a & echo %tmpx%)

выше код выводит значение% tmpx% в какой-то другой сферы - и это всегда постоянная

да, я бегу SETLOCAL ENABLEDELAYEDEXPANSION

в основном мне нужно сделать простой переименуйте все файлы в папке с константыstring_somenameXX.tif на somenameXX.tif, где ie constantstring = 0000000005

Мне пришлось использовать набор, потому что другие сообщения правильно предположили, что% a в a для lo op имеет особое поведение, и подстановки не будут работать для него так, как есть.

я предпочел бы не использовать скрипты и/или PowerShell - если не использовать их невозможно

увольте

+0

Возможный дубликат [Пакетный файл переименования с использованием цикла] (http://stackoverflow.com/questions/19453995/batch-rename-file-using-for-loop) – DavidPostill

ответ

2
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.

+0

Благодарим вас за терпение и подробное объяснение - i используемые параметры, такие как cmd/k и cmd/x, но никогда не отображались на самом деле в cmd /? чтобы увидеть, как вы включили его - в сочетании с таинственным синтаксисом команд CMD/XP все это просто расстроило меня за пределами надежды –

-1

! используется символ, а не% при желании значения времени выполнения. % делает, когда это значение считывается.

CMD был написан инженерами IBM, и они пытались сделать MSDos языком программирования, убедившись, что команды Dos работают одинаково. Таким образом, мы получаем мешанину.

& seperates commands on a line. 

&& executes this command only if previous command's errorlevel is 0. 

|| (not used above) executes this command only if previous command's errorlevel is NOT 0 

> output to a file 

>> append output to a file 

< input from a file 

| output of one command into the input of another command 

^ escapes any of the above, including itself, if needed to be passed to a program 

" parameters with spaces must be enclosed in quotes 

+ used with copy to concatinate files. E.G. copy file1+file2 newfile 

, used with copy to indicate missing parameters. This updates the files modified date. E.G. copy /b file1,, 

%variablename% a inbuilt or user set environmental variable 

!variablename! a user set environmental variable expanded at execution time, turned with SelLocal EnableDelayedExpansion command 

%<number> (%1) the nth command line parameter passed to a batch file. %0 is the batchfile's name. 

%* (%*) the entire command line. 

%<a letter> or %%<a letter> (%A or %%A) the variable in a for loop. Single % sign at command prompt and double % sign in a batch file.