Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 10

Автор: vu1tur
Дата сообщения: 09.01.2011 10:53
Задачи на bat-файлах 10
(часть 1, часть 2, часть 3, часть 4, часть 5, часть 6, часть 7, часть 8, часть 9)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.


Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.

Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.

Для перекодирования кирилицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы


Дополняем шапку: добавляем готовые решения, полезные ссылки.

Примечание: Большие куски кода заключайте в тэг [no][more][/no]

Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии

[more=Полезные ссылки]

[b]Полезные ссылки:


· Cmd. Описание от разработчиков (англ.) (рус.)
· Урок bat-аники (для начинающих)
· Командная строка и сценарии Windows - уроки
· Библиотека функций для командных файлов
· Использование ansi.sys
· Справка по командам в виде Html
· Команды RunDll32
· Пример - получение и обработка списка пользователей
· Пример перехода из 32-битной версии cmd.exe в 64-битную
[/more][/b]


[more=Полезные утилиты]
[b]Полезные утилиты:


· Утилтиа-модуль (VBS-скрипт) для Internet Explorer - Позволяет копировать выделенный текст без пробелов на конце. Особенно полезно на руборде

· base64 - кодирует/раскодирует файл в/из base64
· blat - отправка почты из консоли
· CLCC - консольный калькулятор
· cmdow - изменение параметров и видимости дос-окна
· cnic - включает/выключает сетевой интерфейс
· crc32 - утилита для подсчета контрольных сумм (только CRC)
· curl - передача и прием файлов, используя URL синтаксис
· curtime - утилита для обработки времени в скриптах
· delbyown - поиск файлов, созданных определенным пользователем, на NTFS разделе
· devcon - включение, выключение, удаление и т.д. устройств из Диспетчера Устройств
· dirdate - изменение даты создания/модификации/последнего доступа файлов
· directify - группирование файлов по общим параметрам
· editpath - добавляет или удаляет директории в переменной PATH
· fastsum - подсчет контрольных сумм (только MD5)
· fciv - подсчет контрольных сумм (MD5 и SHA-1)
· fdf - Fast Duplicate Finder, находит одинаковые по содержанию файлы
· fsum - подсчет контрольных сумм (12 различных алгоритмов)
· gsar - General Search and Replace, поиск и замена текста в файле
· hex - вывод бинарного файла в шестнадцатиричном формате
· hstart - скрытый запуск командных файлов и консольных программ
· mediainfo - утилита для просмотра метаданных мультимедийных файлов, консоль и фронтенд
· mirror - копирование, создание точной копии всей структуры директорий
· msgbox - вывод сообщения в диалоговом окне
· msgbox (другая) - еще одна утилита для вывода сообщения в диалогоовм окне
· mtee - выводит входящие данные на экран и в файл (одновременно)
· netcat - мощная утилита для передачи данных по TCP/UDP соединениям
· nircmd - универсальная утилита на все (почти) случаи жизни
· outwit - пакет из 6-ти полезных GNU Win32 утилит
· portqry - проверка статуса TCP и UDP портов на удаленных машинах
· PsTools - отличный набор утилит для администрирования
· ptime - определяет время работы программ (точность до 5 миллисек.)
· Quick Batch File Compiler - позволяет превратить ваш батник в независимое приложение
· regperm - изменение прав доступа к веткам/ключам реестра
· rmtshare - управление шарами
· scrnres - screen resolution. Выводит разрешение экрана в консоль
· sed - мощный текстовый фильтр/процессор с поддержкой регулярных выражений
· setacl - изменение прав доступа к объектам
· setenv - утилита для работы с системными переменными
· smtpsend - отправка сообщений на электронную почту
· Streams - утилита для работы с альтернативными потоками NTFS
· trayconizer - позволяет сворачивать окно программы в трей
· tst - скриптовая утилита для автоматизации telnet-сессий
· uniqline - утилита фильтрующая одинаковые строчки в тексте, умеет удалять пустые строчки и пробелы в начале и конце строк
· UnxUtils - набор GNU утилит для Win32
· wget - консольная утилита для скачивания файлов по HTTP, HTTPS и FTP протоколам
· Win2000 Resource Kit Tools
· Win2003 Resource Kit Tools
· xcodewin - перекодировщик русского текста, поддерживает 14 кодировок
· Пакет утилит для организации интерфейса в bat-файлах
· BAT Enchancer
[/more][/b]


Готовые решения и частые вопросы:
Встроенный справочник по командам
Создание помощи по всем командам консоли 2000 и XP
Делаем паузу в командном файле стандартными средствами Windows
[more=Альтернативные решения »]

Альтернативные решения


· Альтернатива команде ECHO - позволяет выводить текст в файл без перевода строки.
· Установка задержки (паузы) в батнике
· Установка задержки (паузы) в батнике (используя VBScript)
· Конвертирование файлов (*.com *.exe *.*) в код батника
· Переход из 32-битной версии cmd.exe в 64-битную
[/more]
[more=Работа с текстом, датой, и файлами »]

Работа с текстом, датой и файлами


· Создание листинга директорий на примере создания плейлиста
· Переименовывание файлов по дате модификации
· Использование даты на день раньше чем сегодня
· Использование даты на день раньше чем сегодня (учитываются високосные годы)
· Использование даты на день раньше чем сегодня (используя VBScript)
· Использование разницы между датой создания файла(папки) и текущей, в днях или минутах(используя VBScript)
· Конвертирование текста из кириллицы в латиницу
· Проверка существования файла и присвоение ему нового имени в случае если такой файл уже существует
· Замена текста в файле (sbs2.com)
· Удаление всего содержимого каталога, включая подкаталоги, командой rd (не удаляя сам каталог)
· Удаление файлов в указаном каталоге включая подкаталоги, с ведением лога удаления (удалён/не удалён)
· Удаление файлов во всех под/каталогах, имя которых (каталога) содержит определённое значение (Temp к примеру)
· Чтение из файлов содержащих ключи и значения (подобно структуре .ini файлов)
· Получение системного времени в одном формате (вне зависимости от настроек даты и времени системы)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек)
· Разбиение целого числа байтов (размера файла) на тысячные значения
[/more]
[more=Администрирование, автоматизация и сеть »]

Администрирование, автоматизация и сеть


· Запуск сетевого подключения
· Пример выполнения команд по результату команды ping
· Запуск bat файлов как сервис
· SBS - Sleep before shutdown - Утилита для выключеня и перезапуска компьютера через заданное время
· Перезапуск эксплорера с восстановлением открытых директорий
· Download And Extract - батник-гибрид для закачки архивов и моментальной их распаковки в папку с именем самого архива
[/more]
[more=Работа с переменными и параметрами ком. строки »]

Работа с переменными и параметрами ком. строки


· Разименовывание переменных
· Создание (запись) переменных окружения в реестр
· Способ передачи в бат-файл параметра содержащего символы & и последующей обработки полученного значения
[/more]

Описания работы команд и символов участниками темы:
· setlocal enabledelayedexpansion и переменные окружения
· символы & и && в командной строке
· Переменная %0
Автор: zhuchella
Дата сообщения: 09.01.2011 11:18
01MDM


Цитата:
Проверил еще раз, у меня все работает. Ты grep скачал?


Его просто установить и тело программы оставить таким, как Вы предложили ? Или нужно конкретный путь указывать к grep ?
Автор: wolf0425
Дата сообщения: 09.01.2011 11:56

Цитата:
Или нужно конкретный путь указывать к grep ?

grep должен лежать или в одном каталоге с тем батником или в любом из каталогов, перечисленных в переменной PATH
то же самое требование для sed.exe для альтернативного варианта.
Автор: zhuchella
Дата сообщения: 09.01.2011 12:08
wolf0425

Цитата:
в любом из каталогов, перечисленных в переменной PATH

А где перечилслены эти каталоги ?
Автор: king_stiven
Дата сообщения: 09.01.2011 12:31
zhuchella
В гугле спроси
http://www.google.ru/
Автор: king_stiven
Дата сообщения: 09.01.2011 21:07
или так

Код: echo %PATH%
Автор: sL4yer
Дата сообщения: 10.01.2011 01:14
Здравствуйте, как можно сделать индикатор прогресса? Например, для команды move
Автор: Elroir
Дата сообщения: 10.01.2011 01:28
sL4yer
Насколько я знаю, для отдельной команды - никак.
Автор: sL4yer
Дата сообщения: 10.01.2011 01:32
Elroir

а для цикла возможно? И возможно ли это сделать вообще?

Добавлено:
подскажите пожалуйста, почему не работает данное выражение:

Код: for %%i in (*.mp4 *.wmv *.avi *.mpg *.mpeg) do (
    if exist ".\%%i" (
        echo %%i
    ) else (
        echo not found
    )
)
Автор: 01MDM
Дата сообщения: 10.01.2011 09:33
sL4yer
Прогресс-бар неоднократно обсуждался. Например два месяца назад

Цитата:
почему не работает данное выражение

Потому что несуществующие элементы не обрабатываются циклом вообще.
Попробуй так:

Код:
@echo off

for %%i in (mp4 wmv avi mpg mpeg) do (

if exist "*.%%i" (dir /b /a *.%%i) else (echo *.%%i not found)

)
Автор: AvgustiN
Дата сообщения: 10.01.2011 10:08
Здравствуйте!

Имеется вот такой вполне рабочий батничек:

Код: title Load program...Please wait...
@echo off
net use w: \\192.168.1.1\OfficeReg > nul
echo "1. Disk connected"
cd d:\
d:
md KazNTU
cd d:\KazNTU
md CICT
cd d:\KazNTU\CICT
md Registrators
cd d:\KazNTU\CICT\Registrators
md Program
cd d:\KazNTU\CICT\Registrators\Program
md Office.Registrator
copy w:\Office.Registrator.exe d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe > nul
echo "2. File updated"
start d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe > nul
echo "3. Run program"
net use w: /delete > nul
echo "4. Disk disconnected"
exit
rem pause
Автор: JI063uk
Дата сообщения: 10.01.2011 10:15
Здравствуйте. Есть батни следующего содержимого, возникла проблема, когда перезагружаешь с 1 до 9 все нормально, а вот с 10 возникают проблемы, пробовал ставить и 0, 10, A. Ничего не помогает перезагрузить 10 ип адрес. Меняю на любой с 1 до 9 все работает. Подскажите, как сделать, чтобы перезагружались не только с 1 до 9, но и с 10 до 15

Код:
@echo off
CHOICE /C:1234567890 /N KAT01=1, KAT02=2, KAT03=3, KAT04=4, KAT05=5, KOM07=7, KOM08=8, KOM09=9, BEL31=6, BEL30=0 //запрос у пользователя какой комп перезагрузить
IF ERRORLEVEL 9 GOTO 9
IF ERRORLEVEL 8 GOTO 8
IF ERRORLEVEL 7 GOTO 7
IF ERRORLEVEL 6 GOTO 6
IF ERRORLEVEL 5 GOTO 5
IF ERRORLEVEL 4 GOTO 4
IF ERRORLEVEL 3 GOTO 3
IF ERRORLEVEL 2 GOTO 2
IF ERRORLEVEL 1 GOTO 1
IF ERRORLEVEL 0 GOTO 0
:1
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:2
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:3
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:4
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:5
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:6
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:7
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:8
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:9
shutdown -m "\\ип адрес" -r -f -t 00
GOTO End
:0
shutdown -m "\\ип адрес" -r -f -t 00
:End
Автор: BorlandIMHO
Дата сообщения: 10.01.2011 10:53
AvgustiN
1)Ни разу непонятно, зачем столько md/cd.
Можно сразу 1>nul 2>&1 if not exist "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\nul" md "d:\KazNTU\CICT\Registrators\Program\Office.Registrator"
Намного компактнее...
2) 1>nul 2>&1 pushd \\192.168.1.1\OfficeReg && (действия при удачном подключении) || (действия при неудачном подключении)
pushd подключает временный диск на первую с конца свободную букву и делает путь текущим. При удачном подключении выполняются "(действия при удачном подключении)", при неудачном (отсутствует сеть или указанный ресурс) - "(действия при неудачном подключении)"
Автор: AvgustiN
Дата сообщения: 10.01.2011 11:28
BorlandIMHO
1) Спасибо Вам большое! Дело в том, что я только начинаю осваивать батнички. Раньше не сталкивался с этим делом.
2) Теперь как бы мне все это в один код запихнуть? Не поможете? Что такое в Вашем ответе за цифры "1" и "2"? Откда они взялись?
Автор: BorlandIMHO
Дата сообщения: 10.01.2011 11:50

Цитата:
Что такое в Вашем ответе за цифры "1" и "2"? Откда они взялись?

Перенаправление вывода следующей команды. Примерно то же, что в Вашем батнике делает ">nul"

Цитата:
как бы мне все это в один код запихнуть?

Как-то так:
Код: title Load program...Please wait...
@echo off
1>nul 2>&1 pushd "\\192.168.1.1\OfficeReg" && (
echo 1. Network disk connected
1>nul 2>&1 pushd "d:\KazNTU\CICT\Registrators\Program\Office.Registrator" && popd ||1>nul 2>&1 md "d:\KazNTU\CICT\Registrators\Program\Office.Registrator"
1>nul 2>&1 copy /y "Office.Registrator.exe" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe"
echo 2. File updated
start "" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe"
echo 3. Run program
popd
echo "4. Disk disconnected"
) || (
REM действия при неудачном подключении
start "" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe" || echo ERROR! File d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe not found!
)
exit
rem pause
Автор: Elroir
Дата сообщения: 10.01.2011 12:12
JI063uk
Не знаю, какой из множества утилит choice ты пользуешься, но она воспринимает только односимвольные ответы.
Воспользуйся конструкцией set /p :

Код:
@echo off
setlocal
set /p "answer=Please choose the comp to shutdown (1-20): "
goto %answer%
:1 ...
goto End
:2 ...
goto End
...
...
:End
Автор: BorlandIMHO
Дата сообщения: 10.01.2011 12:14
JI063uk
Рекомендую внимательно прочитать справку по choice. Она в принципе никогда не возвращает ERRORLEVEL 0. Исключительно 1 и выше. Варианты выбора (каждый - один символ, неважно буква или цифра) нумеруются от 1 до сколько-там-вариантов. Возвращаемый ERRORLEVEL равен номеру выбранного варианта, независимо от его символьного значения.

Добавлено:
Elroir опередил, однако.
Автор: AvgustiN
Дата сообщения: 10.01.2011 12:16
BorlandIMHO
Я благодарен Вам за помощь! Спасибо огромное!

Я вот тут тоже поломал малость голову и вот что получилось:

Код: @echo off
echo "Пожалуйста, подождите..."
title "Загружается программа..."
pushd \\192.168.10.1\OfficeReg && goto l1 || goto l2
:l1
md "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\"
copy Office.Registrator.exe d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe > nul
echo "Файл обновлен"
start d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe > nul
echo "Программа загружается"
exit
:l2
d:
cd d:\KazNTU\CICT\Registrators\Program\Office.Registrator\
if exist Office.Registrator.exe goto l3 ELSE goto l4
:l4
echo Office.Registrator.exe не найден
pause
exit
:l3
start Office.Registrator.exe > nul
exit
Автор: BorlandIMHO
Дата сообщения: 10.01.2011 12:34
AvgustiN
Вызывает вопрос кусок

Цитата:
:l2
d:
cd d:\KazNTU\CICT\Registrators\Program\Office.Registrator\
if exist Office.Registrator.exe goto l3 ELSE goto l4

Если нет папки под cd - будет ошибка. Лучше сразу проверять существование файла по полному пути: if exist "d:\KazNTU\CICT\Registrators\Program\Office.Registrator\Office.Registrator.exe"
Ну и, если уж воспользовались pushd - добавьте парную команду popd для отключения сетевого диска и возврата в стартовую папку в ветку, где pushd выполнилась успешно.
Автор: AvgustiN
Дата сообщения: 11.01.2011 05:15
BorlandIMHO
Спасибо за советы! Переделал Ваш кусочек и вот что получилось у меня:

Код: @echo off
echo "Please wait... / Пожалуйста, подождите..."
title Load program Office Registrator... / Загрузка программы Office Registrator...
1>nul 2>&1 pushd "\\192.168.1.1\OfficeReg" && (
echo "1. Network disk connected. / Сетевой диск подключен."
1>nul 2>&1 pushd "d:\KazNTU\CICT\Registrators\Program" && popd || 1>nul 2>&1 md "d:\KazNTU\CICT\Registrators\Program"
1>nul 2>&1 copy /y "Office.Registrator.exe" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator.exe"
echo "2. File updated. / Файл обновлен."
start "" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator.exe"
echo "3. Run program. / Программа запущена."
popd
echo "4. Network disk disconnected. / Сетевой диск отключен."
rem pause
) || (
REM действия при неудачном подключении
if exist "d:\KazNTU\CICT\Registrators\Program\Office.Registrator.exe" goto l1 else goto l2
:l2
echo FILE Office.Registrator.exe NOT FOUND! / ОШИБКА! Файл Office.Registrator.exe НЕ НАЙДЕН!
pause
exit
:l1
start "" "d:\KazNTU\CICT\Registrators\Program\Office.Registrator.exe"
exit
)
exit
rem pause
Автор: InSe0F
Дата сообщения: 11.01.2011 19:33
Всем привет! Нужна помощь, задача довольно простая.
Можно ли написать скрипт который будет менять настройки proxy в IE?
указываемые на свойства - подключения - настройки сети
буду благодарен за помощь )
Автор: ComradG
Дата сообщения: 11.01.2011 21:07
гы!

Код: @echo off
setlocal
for /f "usebackq delims=" %%i in (
`@mshta "javascript:var objShell = new ActiveXObject('Shell.Application'); var objFolder = objShell.BrowseForFolder(0, 'Choose folder:', 1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'); try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(objFolder.Self.Path)}; catch (e){}; close();"`) do set fName=%%i
if defined fName (
echo %fName% was choosed.
) else (
echo Terminated by user.
)
endlocal
exit /b
Автор: Accessor
Дата сообщения: 12.01.2011 09:42
InSe0F
что-то типа:
Код: reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d 192.168.1.1:8080
Автор: InSe0F
Дата сообщения: 12.01.2011 14:48
Спасибо! Почти работает, только там надо еще удалить как то "AutoConfigURL", т.е. убрать галочку "использовать скрипт автоматической настройки" (
Автор: Accessor
Дата сообщения: 12.01.2011 15:53
InSe0F
Ну, по аналогии. Только надо знать имя этого параметра. Спроси в топике по реестру или вычисли самостоятельно с помощью regshot
Автор: berkut9737
Дата сообщения: 12.01.2011 18:58
Нужно добавить в нижеприведённую команду параметр:
Копирует только те файлы-источники, которые не существуют в каталоге результата. Подскажите, пожалуйста, как это сделать ?


Цитата:
xcopy a: b: /s /e
Автор: 01MDM
Дата сообщения: 12.01.2011 21:59
berkut9737
xcopy так не умеет. Она может наоборот, обновить только те файлы, которые уже есть в конечной папке. Или обновить существующие и скопировать которых нет.

Автор: berkut9737
Дата сообщения: 13.01.2011 01:29
01MDM

Цитата:
xcopy так не умеет. Она может наоборот, обновить только те файлы, которые уже есть в конечной папке. Или обновить существующие и скопировать которых нет.

Copy тоже не умеет (смотрел справочник).Тогда, с помощью какой команды выполнить данную операцию?
Автор: 01MDM
Дата сообщения: 13.01.2011 06:40
berkut9737
Напиши батник.
Автор: Pavlon333
Дата сообщения: 13.01.2011 11:22
Есть батник, делает с помощью robocopy зеркалирование директории с сервера в директорию у пользователя. Процесс должен протекать прозрачно для пользователя, т.е. на экран не должно выводится никакой служебной информации.
Проблема в том, что процесс этот продолжительный и иногда пользователь не дождавшись его окончания просто закрывает окно.
Батник логи никакие не пишет.

Можно ли прикрутить какой-нибудь простейший прогресс-бар для визуализации процесса?
Например на основе команды ping -n 1 localhost > nul

Пример используемого батника:

@echo off
robocopy \\откуда\ *.doc куда\ /Z /MIR /R:5 /W:15 >nul
robocopy \\откуда\ *.txt куда\ /Z /MIR /R:5 /W:15 >nul
robocopy \\откуда\ *.exe куда\ /Z /MIR /R:5 /W:15 >nul

Может что-нибудь с использованием условия по errorlevel замутить? И запуском другого батника c прогрессом по команде call ?


Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: зависает установка Windows XP: 39 минут


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.