cmd для повторного переименования массы цикла oneliner

Я над головой с этим - уже потратил слишком много времени на поиск - очевидно, я не понимаю основ переменных CMD и т. д. - и это всегда вызывает у меня такую ​​головную боль

почему это не сработает?

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

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

да, я запускаю setlocal ENABLEDELAYEDEXPANSION

в основном мне нужно сделать простое переименование всех файлов в папке из constring_somenameXX.tif в somenameXX.tif, где т.е. Constantstring=0000000005

мне пришлось использовать set, потому что в других сообщениях справедливо предполагалось, что %a в цикле for имеет особое поведение, и замены не будут работать для него как есть.

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

благодарю вас


person hello_earth    schedule 27.11.2014    source источник
comment
возможный дубликат пакетного переименования файла с использованием цикла for   -  person DavidPostill    schedule 28.11.2014


Ответы (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.

person MC ND    schedule 28.11.2014
comment
спасибо за ваше терпение и подробное объяснение - я использовал такие параметры, как cmd / k и cmd / x, но никогда не смотрел на cmd /? чтобы увидеть, как вы его включаете - в сочетании с загадочным синтаксисом команд CMD/XP все это просто расстроило меня безнадежно - person hello_earth; 28.11.2014

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

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.
person noodlesstillalive    schedule 27.11.2014