Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Модерирует : gyra, Maz

Widok (19-11-2007 12:08): лимит страниц. продолжаем здесь  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

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%
Убрать его.

Всего записей: 1671 | Зарегистр. 08-12-2004 | Отправлено: 16:11 13-11-2005 | Исправлено: igor_andreev, 17:47 13-11-2005
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Widok (19-11-2007 12:08): лимит страниц. продолжаем здесь


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru