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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
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 значения)

Всего записей: 3749 | Зарегистр. 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
Elroir



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GOODmen
К строчке rar-а, добавь  
Код:
 | find /v "OK"  

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



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

Код:
 
FOR %%c in ( *.rar ) do set Rar=%%c
If NOT exist ..\Ready\%Rar% (move %Rar% ..\Ready\%Rar%) ELSE (
FOR /L %%j in (1,1,10) do set Num=%%j
FOR %%c in ( *.rar ) do If NOT exist ..\Ready\%%~nc%Num%.rar move %%c ..\Ready\%%~nc%Num%.rar
)
 

 
 
Snerov1k
 

Цитата:
если я поставлю NEXT - он уейдет после первого цикла?

В принципе да, я немного изменил код в своём посте, так думаю будет надёжнее.

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR, спасибо за подсказку, вроде работает. Но тут созрел ещё вопросец, теперь у меня батник выглядит вот так:
 
@echo off
 
regedit /s 1.reg
start /wait dmaster.exe /VERYSILENT /SP-  
taskkill.exe /F /IM dmaster.exe  
taskkill.exe /F /IM iexplore.exe
ping -n 1 localhost > nul
Megaportal.url.url
ping -n 1 localhost > nul
Main-Theme-Lost.mp3
 
Т.е. сначала вносятся данные в реестр без палева, потом скрыто устанавливается Даунлоад Мастер, после установки которого автоматически закрывается окно самого ДМ и ИЕ, затем пауза 1с, запуск ярлыка инета, пауза и запуск MP3-ки...... вопрос в том, как сделать так, чтобы чёрное окно батника убиралось сразу после запуска MP3 !? А то у меня пока плеер не закроешь, окно не уйдёт (((
 
Кайф вообще сделать чтобы всё было скрыто, но с этими прогами не работал ни разу ещё (((

Всего записей: 396 | Зарегистр. 08-06-2006 | Отправлено: 09:23 17-10-2006
Kronix

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
to ViSiToR: спасибо за подсказку, и как сам не додумался=)
сделал так:
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 (If exist %%c ( move %%c ..\Ready\%%~nc%%j.rar))))
)

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



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

Цитата:
как сделать так, чтобы чёрное окно батника убиралось сразу после запуска MP3 !?

Просто довавь start перед запуском файла, вот так:
 

Код:
@echo off  
 
regedit /s 1.reg  
start /wait dmaster.exe /VERYSILENT /SP-  
taskkill.exe /F /IM dmaster.exe  
taskkill.exe /F /IM iexplore.exe  
ping -n 1 localhost > nul  
Megaportal.url.url  
ping -n 1 localhost > nul  
start Main-Theme-Lost.mp3

 

Цитата:
сделать чтобы всё было скрыто

Скачай программу cmdow, помести её рядом с батником, и в начало батника пропиши следующее:
 

Код:
Title Заголовок окна
cmdow "Заголовок окна" /HID

 
Там где Заголовок окна, естественно можешь прописать любое значение, но чтобы во время запуска батника, окна с таким же заголовком не было.
 
Окно батника мелькнёт на секунду (при запуске), и всё, потом оно скроется.

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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все пашет Спасибо

Всего записей: 48 | Зарегистр. 12-10-2006 | Отправлено: 10:23 17-10-2006
Craager



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR, Мегареспект !!! Спасибо, всё работает как часы !!!
 
А ты случаем не знаешь как поставить тихо (скрыто) Crystal Player !? Какие там ключи надо прописывать )))

Всего записей: 396 | Зарегистр. 08-06-2006 | Отправлено: 10:31 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-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru