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

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

Модерирует : KLASS, IFkO

vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задачи на bat-файлах
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Набор GNU утилит для win32
· Встроенный справочник по командам: hh ntcmds.chm
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
 
Готовые решения и частые вопросы:
· Создание листинга директорий на примере создания плейлиста
· Разименовывание переменных
· Переименовывание файлов по дате создания
· Запуск сетевого подключения
· Запуск bat файлов как сервис
· Пример выполнения команд по результату команды ping
· Использование даты на день раньше чем сегодня
 
Невозможности — что нельзя сделать с помощью командных файлов:
· изменть конфигурацию IP на удаленной машине (без помощи rcmd.exe) [добавил ALEF]
 
 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Старая версия первого сообщения

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 22:58 18-11-2005 | Исправлено: Elroir, 05:50 11-11-2006
GOODmen



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
может здесь кто знает как сказать РАРу чтоб он не перечислял все файла при архивировании из комстроки, а вывел только результат? у меня этот процесс логируется, и видеть всю кучу файлов не совсем хочется

Всего записей: 366 | Зарегистр. 15-01-2004 | Отправлено: 09:14 16-10-2006
kazavo4ka



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
To All
Загляните пожалуйста в этот топик. Может кто-нибудь поможет.
Сорри если не совсем в тему, просто очень уж надо...

Всего записей: 1655 | Зарегистр. 17-02-2006 | Отправлено: 09:56 16-10-2006 | Исправлено: kazavo4ka, 10:01 16-10-2006
Snegov1k



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Этот код считает количество:
@Echo Off  
set Counter=0  
FOR /F %%i IN ('dir /b /a-d /on Log\*.Log') DO Call :Count %%i  
echo %Counter%  
GoTo :EOF  
 
:Count  
echo %1  %counter%  
Set /a Counter=%Counter%+1  
GoTo :EOF  
 
А как результат в файл записать? ) ( В название или тело)  
 

Всего записей: 48 | Зарегистр. 12-10-2006 | Отправлено: 09:58 16-10-2006
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Craager

Цитата:
что в батнике прописать нужно, чтобы была пауза секунды 3-4

 

Код:
ping -n 3 localhost > nul

 
Если нужно 4, то естественно вместо 3 прописать 4
 
Elroir

Цитата:
Какие errorlevels возвращает команда del?

Можно проверить...
 

Код:
@echo off  
del test.txt
echo %errorlevel%
pause

 
Судя по данной проверке, возвращается всегда 0 (пусть файл существует, или нет)  
 
Добавлено:
Snegov1k

Цитата:
как результат в файл записать?

А через echo не проходит?
 

Код:
echo %counter% >> ResultCount.txt


----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 10:16 16-10-2006
Snegov1k



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR А как оставить только последнее значение?
 
Добавлено:
А можно в этот файл запихнуть еще и общий размер файлов?
ЗЫ как бат заставить понимать русские пути?

Всего записей: 48 | Зарегистр. 12-10-2006 | Отправлено: 10:51 16-10-2006 | Исправлено: Snegov1k, 13:33 16-10-2006
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR
Спасибо, а то я уже начал думать, что у меня руки кривые
Ноль возвращается вообще всегда - есть файл, нет , read-only  и т.д.
All
Ситуация такая - пытаюсь добиться от команды del ответа - удалила ли она файл(read only). Так как errorlevel она всегда возвращает нулевой, делаю так:

Код:
del "%%i" 2>&1 | find "Access" > nul  

То есть в принципе если файл только для чтения, то del выдает сообщение Access denied
и find это находит.Дальше проверяю по errorlevel find-а

Код:
if errorlevel 0 (echo Read only file ) else (echo File was deleted)

Проблема в том, что он всегда выдает "Read only file", независимо от того защищен ли файл.
Может я чего-то не то делаю?
loat
Если решится приведенная выше проблема, то батник для тебя готов

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 13:29 16-10-2006
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Elroir

Цитата:
if errorlevel 0 (echo Read only file ) else (echo File was deleted)  
 
Проблема в том, что он всегда выдает "Read only file", независимо от того защищен ли файл.  
Может я чего-то не то делаю?  

Вот так:

Код:
 
if errorlevel 1 (echo File was deleted) else (echo Read only file )
 


Всего записей: 3464 | Зарегистр. 09-02-2003 | Отправлено: 13:47 16-10-2006
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Спасибо!  А почему от перемены мест слагаемых, сумма меняется?
loat

Код:
 
@echo off
if "%1"=="" goto exit
chcp 1251 > nul
for %%i in ( %1*.* ) do (
del "%%i" 2>&1 | find "Access" > nul
if errorlevel 1 ( echo Файл "%%i" удален. ) else ( call :choice "%%i" )  
)
goto exit
 
:choice
setlocal
set del_choice=
set /p del_choice=Файл %1 защищен от удаления. Удалить его?  
if not '%del_choice%'=='' set choice=%choice:~0,1%
if /I '%del_choice%'=='Y' call :force %1
if /I '%del_choice%'=='Д' call :force %1
endlocal
goto exit
 
:force
del /f /q %1  
echo Файл %1 удален.
 
:exit
 

 
Добавлено:
Назови файл так, что-бы его первая буква не использовалась в названиях файлов в директории и дай ему аттрибут "только для чтения" - иначе можно случайно стереть сам батник.

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:04 16-10-2006
Kirillhome



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Elroir
А не проще проверку удаления делать через if exist "%%i"???

Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 14:10 16-10-2006
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kirillhome
Проще, конечно
Вот что получается, когда делаешь что-то в 4 часа утра.

Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:28 16-10-2006
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Elroir
Если нужна проверка файла на то, имеет ли он атрибут “Только для чтения”, то попробуй такой вариант:
 

Код:
@echo off
attrib fileTocheck.txt > for.tmp
for /f "delims=A " %%I in (for.tmp) do if /i "%%I"=="R" (echo Read only file) else (echo File was deleted)
del /f /q for.tmp
pause

 
Но если файл будет иметь атрибут скрытый, то опять-таки проверка провалится, нужно тогда предварительно установить атрибут не скрытый (-h).
 
Snegov1k
 

Цитата:
как оставить только последнее значение?

Попробуй убрать один перегнаправляющий знак...

Код:
echo %counter% > ResultCount.txt

 

Цитата:
можно в этот файл запихнуть еще и общий размер файлов?

Можно, я сам пару страниц назад этим (почти) интересовался, и вот решение (от KapralBel - немного изменённое)...
 

Код:
Set Size=0  
For /R "Log\" %%a in (*.log) Do Call :Label1 %%~za  
Echo. >> ResultCount.txt
Echo size=%Size% >> ResultCount.txt
GoTo :EOF  
   
:Label1  
Set /A Size=%Size%+%1  
GoTo :EOF

 
(это поместить в конец батника).
 

Цитата:
 как бат заставить понимать русские пути?

 

Код:
chcp 1251

 
А это в самое начало батника . Также желательно весь путь заключать в двойные кавычки, т.е так - "я\ кириллический путь\с кавычками\ и с пробелами"

----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 14:37 16-10-2006
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Elroir

Цитата:
Спасибо!  А почему от перемены мест слагаемых, сумма меняется?

Потому, что проверка через errorlevel это проверка на БОЛЬШЕ ИЛИ РАВНО.
Соответственно:
if errorlevel 1 - это >= 1
а
if errorlevel 0 - это >= 0 (т.е. ВСЕ возвращаемые find значения)

Всего записей: 3464 | Зарегистр. 09-02-2003 | Отправлено: 15:01 16-10-2006
Snegov1k



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR, получилось так
@echo off                                                        
chcp 1251                                                        
set Counter=0                                                    
FOR /F %%i IN ('dir /b /a-d /on C:\TEMP\*.*') DO Call :Count %%i
echo %Counter%                                                  
GoTo :EOF                                                        
                                                                 
:Count                                                          
echo %1  %counter%                                              
Set /a Counter=%Counter%+1                                      
Set Size=0                                                      
For /R "C:\TEMP" %%a in (*.*) Do Call :Label1 %%~za              
Echo. >> ResultCount.txt                                        
Echo size=%Size% > ResultCount.txt                              
Echo %counter% >> ResultCount.txt                                
GoTo :EOF                                                        
                                                                 
:Label1                                                          
Set /A Size=%Size%+%1                                            
GoTo :EOF                                                        
                         
А как после выполнения всех этих действий продолжить выполнение программы?  
(в моем случаем почтовик вызывается, прикрепляется этот файл и уходит дальше)
 
А GoTo :EOF как расшифровать?

Всего записей: 48 | Зарегистр. 12-10-2006 | Отправлено: 15:05 16-10-2006 | Исправлено: Snegov1k, 17:23 16-10-2006
Kronix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ещё раз обращаюсь с задачкой, нужно перенести файлы в папку Ready  
:: Переносим в папку Ready  
FOR %%c in ( *.rar ) do (  
 set NameRar=%%c  
 FOR /L %%j in (1,1,100) do (  
  if exist ..\Ready\%NameRar% (set NameRar=%%~nc%%j.rar)  
 )  
 move %%c ..\Ready\%NameRar%  
)  
Неправильно работает (пытаюсь к имени файла добавить номер, если такой уже существует)

Всего записей: 107 | Зарегистр. 21-03-2006 | Отправлено: 18:08 16-10-2006
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Snegov1k

Цитата:
А как после выполнения всех этих действий продолжить выполнение программы?  

 
Вместно :EOF поставь метку на продолжение скрипта...
 

Код:
 
@echo off                                                    
                                                       
set Counter=0                                                    
FOR /F %%i IN ('dir /b /a-d /on ..\opera\*.*') DO Call :Count %%i  
echo %Counter%                                                    
Echo size=%Size% > ResultCount.txt                                
Echo %counter% >> ResultCount.txt  
GoTo Next                                              
                                                                   
:Count                                                            
echo %1  %counter%                                              
Set /a Counter=%Counter%+1                                        
Set Size=0
For /R "..\opera" %%a in (*.*) Do Call :Label1 %%~za                      
GoTo :EOF
                                                                 
:Label1                                                          
Set /A Size=%Size%+%1                                            
GoTo :EOF
 
:Next
echo тут остальной скрипт
 
 

 
У тебя лишняя строка оказалась  Echo. >> ResultCount.txt, после неё идёт прописывание в файл с перезаписью, так что при таком расскладе, эта строка там лишняя (я её добавил для перевода строки в файле, как разделитель между размером вписываемых файлов и счётчиком).
 

Цитата:
А GoTo :EOF как расшифровать?

GoTo это команда определяющая переход на метку, метка должна иметь двоиточие в начале, а :EOF это означает переход в конец скрипта.
 
Вот пример вечного цыкла между переходом и меткой:
 

Код:
:начало
goto метка
 
тут ничего не будет делаться вечно (если не закрыть насильно окно ком. строки ) - т.е команда goto метка будет посылать постоянно скрипт на метку :метка, а после перехода, наткнувшись на ещё одну команду, которая тоже посылает скрипт на метку (:Начало), скрипт как бы уйдёт во вечную петлю между метками, начав весь цикл сначала.
 
:метка
goto начало

 
goto расшифровывется (а также и переводится с Англ.) как "Перейти к...".

----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 21:26 16-10-2006 | Исправлено: ViSiToR, 08:42 17-10-2006
Snerov1k

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спиасибо  
Насчет лишней точки - это записывается второй результат ( считается кол-во и общий объем файлов).
Т.е. перейдет к выполнению дальнейших операций -посчитав- количество и -объем-?
 
(результат файл ResultCount.txt с текстом  
size-34348
3 (кол-во частей)
 
Добавлено:
:Label1                                                            
Set /A Size=%Size%+%1                                              
GoTo Next  
 
считает размер - и если я поставлю NEXT - он уейдет после первого цикла?

Всего записей: 5 | Зарегистр. 12-10-2006 | Отправлено: 21:35 16-10-2006
loat



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Помогите пожалуйста.  
Нужно написать такой батник чтобы он удалял файлы текущего каталога, имена которых начинаются с буквы, указанной в качестве параметра. Для каждого файла случае успешного удаления выдавать сообщение: «Удален файл (имя_файла)». В случае неудачи выдавать сообщение: «Файл (имя_файла) защищен от удаления. Удалить его?» и в случае ответа «Д» или «Y» все-таки удалить файл.

Всего записей: 89 | Зарегистр. 24-01-2005 | Отправлено: 02:17 17-10-2006
Kirillhome



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
loat
А для кого это писалось???

Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 02:30 17-10-2006
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Понятно. Очень правильное, все таки, высказывание - RTFM.
Надо мне посерьезней к нему отнестись.
 
loat
Окончательный вариант таков ( спасибо Kirillhome)

Код:
 
@echo off
if "%1"=="" goto exit
chcp 1251 > nul
for %%i in ( %1*.* ) do (
del "%%i" 2>nul > nul
if not exist %%i ( echo Файл "%%i" удален. ) else ( call :choice "%%i" )
)
goto exit
 
:choice
setlocal
set del_choice=
set /p del_choice=Файл %1 защищен от удаления. Удалить его?  
if not '%del_choice%'=='' set choice=%choice:~0,1%
if /I '%del_choice%'=='Y' call :force %1
if /I '%del_choice%'=='Д' call :force %1
endlocal
goto exit
 
:force
del /f /q %1  
echo Файл %1 удален.
 
:exit
 


Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 02:59 17-10-2006
Kronix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сделал вот так:
 
FOR %%c in ( *.rar ) do (
 if NOT exist ..\Ready\%%c (move %%c ..\Ready\%%c) ELSE (
   FOR /L %%j in (1,1,10) do (
     if NOT exist ..\Ready\%%~nc%%j.rar (move %%c ..\Ready\%%~nc%%j.rar)))
)
Работает, но после первого переноса файла будет выскакивать сообщение о том, что файл не существует. Как выйти и цикла не понятно, set j=10 не помогает

Всего записей: 107 | Зарегистр. 21-03-2006 | Отправлено: 03:10 17-10-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах
vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru