2016-11-11 4 views
-1

У меня есть пакетный файл, который распаковывает архивы из каталога и переименовывает извлеченные файлы. Содержимое моего пакетного файла являются:Пакетный файл для распаковки и переименования файлов

for /F %%I IN ('dir /b /s *.zip *.rar') DO (
"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I" -aoa 
) 
DEL *.zip 
@echo off 
set i=1 
for %%f in (*.xml) do call :renameit "%%f" 
goto done 

:renameit 
ren %1 FileName%i%_Msd.xml 
set /A i+=1 

:done 

Я ожидаю, что файлы будут переименованы в

FileName1.xml 
FileName2.xml 
FileName3.xml 
... 

Однако, переименованные имена файлов, кажется, начинается с 2 вместо 1. Если я повторена командный файл после того, как он изначально был извлечен и некорректно переименован, начиная с 2, он исправляет эту ошибку имен и начинается с одной.

Как исправить это, так как правильно переименованные файлы начинаются с 1?

+1

попробуйте использовать набор я = 0 вместо г = 1 –

+0

Предполагая, что вы не отключили ECHO OFF в верхней части вашего сценария, смотрите программу выполнить. В частности, смотрите команду rename. Если вы должны поместить ПАУЗА после команды переименования. – Squashman

+0

@Byakko_Haku Вы предложили работу, и переименованные файлы начинаются с 1 сейчас. Спасибо за вашу помощь! – Klicker

ответ

2

Объяснение для вас, и если бы вы просмотрели выполнение CODE, вы бы увидели этот PLAIN как день.

Команда FOR выполняет итерацию файлов в текущей папке по одному файлу за раз. Например, если у вас есть три файла в вашей папке с именем A.txt, B.txt и Z.txt, команда FOR сначала обрабатывает A.txt и переименовывает ее в файл File1.txt. Затем он видит B.txt, потому что это следующий файл в алфавитном порядке и переименовывает его в файл File2.txt. Теперь, когда вы переименовали A.txt в файл File1.txt, он видит следующий файл и переименовывает его в файл File3.txt. После этого он видит Z.txt и переименовывает его также в файл File4.txt. Таким образом, проблема не в вашей переменной счетчика, так как команда FOR обрабатывает файлы в папке.

Теперь, если вы проверите этот код.

@echo off 
dir /b *.txt 

set i=1 
for %%f in (*.txt) do call :renameit "%%f" 
pause 
GOTO :EOF 

:renameit 
@ECHO ON 
ren %1 FileName%i%.txt 
@ECHO OFF 
set /A i+=1 

Ваш выход будет выглядеть следующим образом.

A.txt 
B.txt 
Z.txt 

C:\test>ren "A.txt" FileName1.txt 

C:\test>ren "B.txt" FileName2.txt 

C:\test>ren "FileName1.txt" FileName3.txt 

C:\test>ren "Z.txt" FileName4.txt 
Press any key to continue . . . 

Теперь, если вы смените с помощью команды FOR/F для разбора вывода команды DIR, вы получите желаемый результат. Команда DIR будет выполнять всю свою обработку перед тем, как команда FOR возьмет на себя и начнет обработку вывода.

Так изменение кода:

@echo off 
dir /b *.txt 

set i=1 
for /F "delims=" %%f in ('dir /a-d /b *.txt') do call :renameit "%%f" 
pause 
GOTO :EOF 

:renameit 
@ECHO ON 
ren %1 FileName%i%.txt 
@ECHO OFF 
set /A i+=1 

Ваш выход будет теперь это.

A.txt 
B.txt 
Z.txt 

C:\test>ren "A.txt" FileName1.txt 

C:\test>ren "B.txt" FileName2.txt 

C:\test>ren "Z.txt" FileName3.txt 
Press any key to continue . . . 
+0

Спасибо, что нашли время, чтобы полностью объяснить, в чем проблема: @Squashman. С вашим объяснением это, безусловно, просто, как день, и ваше решение гораздо более надежное, чем первоначальное решение, поэтому я изменил его, как вы предлагаете, и работает отлично. – Klicker

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