igor_andreev
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ну такой простой пример. Нужно записать все файлы в папке в текстовой файл и перед каждым поставить номер, но не простой, а обязательно четырехзначный. Чтобы текст был вида: Цитата: 0001. файл 0002. файл 0003. файл 0004. файл 0005. файл 0006. файл 0007. файл 0008. файл 0009. файл 0010. файл 0011. файл 0012. файл 0013. файл ... и так далее 0167. файл 0168. файл ... | Что первым делом делают? Ну наверное пытаются изобразить похожую конструкцию: test_1.cmd Код: @ECHO OFF SET FILECOUNT=0 FOR %%A IN (%windir%\system32\*.*) DO ( SET /A FILECOUNT+=1 IF %FILECOUNT% LSS 10000 SET COUNTER=%FILECOUNT% IF %FILECOUNT% LSS 1000 SET COUNTER=0%FILECOUNT% IF %FILECOUNT% LSS 100 SET COUNTER=00%FILECOUNT% IF %FILECOUNT% LSS 10 SET COUNTER=000%FILECOUNT% ECHO %COUNTER%. %%A>>TEST_1.TXT ) | Работает test_1.cmd? Хрен там, винда каждый раз в DO ... присваивает переменной FILECOUNT новое значение, но с этим %FILECOUNT% ничего сделать нельзя(в данном случае нужное количество ноликов добавить), пока не выйдешь из этого FOR ... DO ... Ладно, пробуем вызывать каждый раз из FOR ... DO ... метку батника :_MYLABEL, передаем ей в качестве параметра имя очередного файла и там добавить нужное количество нулей: test_2.cmd Код: @ECHO OFF SET FILECOUNT=0 FOR %%A IN (%windir%\system32\*.*) DO ( SET /A FILECOUNT+=1 CALL :_MYLABEL "%%A" ) GOTO EOF :_MYLABEL IF %FILECOUNT% LSS 10000 SET COUNTER=%FILECOUNT% IF %FILECOUNT% LSS 1000 SET COUNTER=0%FILECOUNT% IF %FILECOUNT% LSS 100 SET COUNTER=00%FILECOUNT% IF %FILECOUNT% LSS 10 SET COUNTER=000%FILECOUNT% ECHO %COUNTER%. %~1>>TEST_2.TXT GOTO EOF :EOF | Работает test_2.cmd? Работает, куда он денется. А с включением отложенных расширений командного процессора(ENABLEDELAYEDEXPANSION) этот батник пишется вот так: test_3.cmd Код: @ECHO OFF & SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION SET FILECOUNT=0 FOR %%A IN (%windir%\system32\*.*) DO ( SET /A FILECOUNT+=1 IF !FILECOUNT! LSS 10000 SET COUNTER=!FILECOUNT! IF !FILECOUNT! LSS 1000 SET COUNTER=0!FILECOUNT! IF !FILECOUNT! LSS 100 SET COUNTER=00!FILECOUNT! IF !FILECOUNT! LSS 10 SET COUNTER=000!FILECOUNT! ECHO !COUNTER!. %%A>>TEST_3.TXT ) ENDLOCAL | О как... Результат вроде такой же, как и при использовании test_2.cmd(c меткой :_MYLABEL). Но если натравить test_2.cmd и test_3.cmd на папку, где файлов эдак тыщ 100, то невооруженным глазом и без секундомера видно, что батник с ENABLEDELAYEDEXPANSION работает быстрее. Не надо ему уйму тысяч раз метаться по "всему себе любимому" и искать метку :_MYLABEL(особенно актуально, если батник на несколько десятков килобайт и всяких меток там много), там что-то делать, возвращаться обратно... Присвоено-обработано-переназначено несколько тысяч переменных и все не выходя из одного FOR ... Текстовой файл - эт так, для примера просто, первое что в голову пришло. В реале можно так переименовывать файлы например, по папкам раскладывать или еще что полезное. Если делать copy&paste test_1(2,3).cmd, то вставляется лишний пробел в конце строки после SET /A FILECOUNT+=1 и SET COUNTER=(000)%FILECOUNT% Убрать его. |