2015-03-10 4 views
0

Задача состоит в том, чтобы переименовать пять случайных файлов в renamed1.ren, renamed2.ren, ..., renamed5.ren, используя командную строку. Вот то, что я пришел:Переименование файлов в Windows с помощью FOR

set i=1 
for /f "tokens=*" %f in ('dir /b') do (
ren %f renamed%i%.ren 
set /a i+=1) 

Я ожидал, что i будет увеличиваться в каждой итерации, но это не сработало. Что я могу изменить?

+0

Вы действительно хотите изменить расширение файлов? ! Это похоже на плохую идею. – dbenham

ответ

1

Вот один вкладыш, который не требует отсроченного расширения.

Из командной строки:

for /f "tokens=1* delims=:" %A in ('dir /b^|findstr /n "^"') do @ren "%B" "renamed%A.ren" 

В рамках пакетного сценария

@echo off 
for /f "tokens=1* delims=:" %%A in ('dir /b^|findstr /n "^"') do ren "%%B" "renamed%%A.ren" 
+0

Ничего себе, этот работал просто отлично, спасибо. Не могли бы вы объяснить немного этой магии? Это, в частности: '' dir/b^| findstr/n "^" ''. – dardvas

+0

@dardvas - Я передаю вывод вашего DIR/B в FINDSTR. Строка поиска регулярного выражения ''^"' соответствует началу строки и гарантированно соответствует всем строкам. Параметр '/ n' префикс каждого совпадения с номером строки, за которым следует двоеточие. – dbenham

2
SETLOCAL ENABLEDELAYEDEXPANSION  
set i=1 
for /f "tokens=*" %%f in ('dir /b') do (
ren %%f renamed!i!.ren 
set /a i+=1) 

В пределах оператора блока (a parenthesised series of statements), блок вся анализируется и затем выполняется. Любой %var% в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - ​​то же самое относится к FOR ... DO (block).

Следовательно, IF (something) else (somethingelse) будет выполнен с использованием значений %variables% в момент возникновения ошибки IF.

Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion и использовать !var! вместо %var%, чтобы получить доступ к измененному значению var или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.

Внутри командного файла ссылки на переменную цикла связи требуют удвоения числа %.

+0

А что, если я работаю в командной строке, а не в пакетном файле? Попробовали запустить код, который вы предложили (без удвоения%), и он работал точно так же. – dardvas

+0

Различные люди работают по-разному. Если вы хотите ввести все это вместо использования пакетного файла, это зависит от вас. Я бы записал его как пакетный файл. – Magoo

+0

«Точно так же» я имел в виду, что он не работает должным образом, как в моем первом случае. Может быть, 'SETLOCAL ENABLEDELAYEDEXPANSION' не работает в командной строке? – dardvas

Смежные вопросы