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

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

Автор: vu1tur
Дата сообщения: 14.11.2006 15:59
Задачи на bat-файлах (часть 1)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.


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

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

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

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

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

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


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


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


· addline - добавляет строчку в текст. файл
· base64 - кодирует/раскодирует файл в/из base64
· blat — отправка почты из консоли
· 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 - скрытый запуск командных файлов и консольных программ
· mirror - копирование, создание точной копии всей структуры директорий
· msgbox - вывод сообщения в диалоговом окне
· msgbox (другая) - еще одна утилита для вывода сообщения в диалогоовм окне
· mtee - выводит входящие данные на экран и в файл (одновременно)
· natcat - мощная утилита для передачи данных по TCP/UDP соединениям
· nircmd - универсальная утилита на все (почти) случаи жизни
· outwit - пакет из 6-ти полезных GNU Win32 утилит
· portqry - проверка статуса TCP и UDP портов на удаленных машинах
· PsTools - отличный набор утилит для администрирования
· Quick Batch File Compiler - позволяет превратить ваш батник в независимое приложение
· regperm - изменение прав доступа к веткам/ключам реестра
· scrnres - screen resolution. Выводит разрешение экрана в консоль
· sed - мощный текстовый фильтр/процессор с поддержкой регулярных выражений
· setacl - изменение прав доступа к объектам
· setenv - утилита для работы с системными переменными
· smtpsend - отправка сообщений на электронную почту
· tst - скриптовая утилита для автоматизации telnet-сессий
· UnxUtils - набор GNU утилит для Win32
· wget - консольная утилита для скачивания файлов по HTTP, HTTPS и FTP протоколам
· Win2000 Resource Kit Tools
· Win2003 Resource Kit Tools
· xcodewin - перекодировщик русского текста, поддерживает 14 кодировок
· Пакет утилит для организации интерфейса в bat-файлах
[/more][/b]


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

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


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

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


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

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


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

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


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

Описания работы команд и символов участниками темы:
· setlocal enabledelayedexpansion и переменные окружения
· символы & и && в командной строке
· Переменная %0

Невозможности — что нельзя сделать с помощью командных файлов:
· изменть конфигурацию IP на удаленной машине (без помощи rcmd.exe) [добавил ALEF]

[more=Старая версия первого сообщения]
Готов решить любую задачу по программированию на bat-файлах для системы WinXP.

Вот пример:
Подсчитать количество счастливых 6-ти значных билетов (сумма первых 3-х цифр = сумме последних 3-х).
Мое решение:

Код: rem bilet.bat (c) HACSoft, 2005.
echo off
setlocal enabledelayedexpansion
cls
echo Complete: 00 %%
set cnt=0
set old=0
for /l %%a in (0,1,9) do (
for /l %%b in (0,1,9) do (
for /l %%c in (0,1,9) do (
set /a left=%%a+%%b+%%c
for /l %%d in (0,1,9) do (
for /l %%e in (0,1,9) do (
set /a cmp=left-%%d-%%e
if !cmp! geq 0 (
if !cmp! leq 9 (
set /a cnt+=1
if not !old!==%%b (
set old=%%b
cls
echo Complete: %%a%%b %%
)
)
)
)
)
)
)
)
cls
echo Result: %cnt%
Автор: xxx123123
Дата сообщения: 14.11.2006 19:14
нужен батник,который перезапустит все компы из локальной сети и переименовывает их соответственно в labarab_1 labarab_2 itd
Автор: Elroir
Дата сообщения: 14.11.2006 19:43
centell
В общем так - батник проверяет все файлы в текущей директории, находит все те, которые созданы ровно 4 недели назад и показывает их. Чтобы изменить критерий отбора на проверку, надо в первом for-е, в скобках указать маску или название файла.
В предпоследней строке "echo %4", вместо %4 подставляется имя найденного файла, то есть "echo" можно заменить на любую команду (команды). Батник работает достаточно медленно, потому что для каждого проверяемого файла, запускается команда dir (чтобы найти время создания). [more=Код файла]

Код:
@echo off
setlocal
set dt=%date%
FOR %%I IN (*.*) DO call :finddate "%%I" %dt:~3,2% %dt:~6,2% %dt:~9,4%
goto :EOF

:finddate
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%B %%C %%D %1 %2 %3 %4
goto :EOF

:test
rem File's date
set fd=%1
set fm=%2
set fy=%3
rem Current date
set curd=%5
set curm=%6
set cury=%7
set /a prevd=%curd%-28
set prevm=%curm%
set prevy=%cury%
set prevye=%cury%
if %curm%==12 ( set prevme=11& set days=30)
if %curm%==11 ( set prevme=10& set days=31)
if %curm%==10 ( set prevme=09& set days=30)
if %curm%==09 ( set prevme=08& set days=31)
if %curm%==08 ( set prevme=07& set days=31)
if %curm%==07 ( set prevme=06& set days=30)
if %curm%==06 ( set prevme=05& set days=31)
if %curm%==05 ( set prevme=04& set days=30)
if %curm%==04 ( set prevme=03& set days=31)
if %curm%==03 ( set prevme=02& set days=28)
if %curm%==02 ( set prevme=01& set days=31)
if %curm%==01 ( set prevme=12& set days=31& set /a prevye=%prevy%-1)
if %prevd% LEQ 0 (
set /a prevd=%days%+%prevd%
set prevm=%prevme%
set prevy=%prevye%
)
set match=true
if not "%fd%"=="%prevd%" ( set match=false)
if not "%fm%"=="%prevm%" ( set match=false)
if not "%fy%"=="%prevy%" ( set match=false)
if "%match%"=="true" (
echo %4
)
Автор: 01MDM
Дата сообщения: 14.11.2006 19:56
Elroir

Спасибо за cnic.exe. Очень удобная штучка. А через netsh так и не смог добиться желаемого.
Автор: sD31337
Дата сообщения: 14.11.2006 21:43
Elroir
привет
Скажи можно ли создать bat каторый при запуске отсылает на удаленный ПК в лакальной сети какой нитьфайл ну например
"команда для отправки файла" ип моего ПК 192.168.124.131\папку куда кидать\------>к этой папке будет общий доступ
Автор: Pinoccio
Дата сообщения: 14.11.2006 21:52
sD31337,

copy?

Код: copy file.txt \\192.168.124.131\folder
Автор: Elroir
Дата сообщения: 14.11.2006 22:34
sD31337

Цитата:
можно ли создать bat каторый при запуске отсылает на удаленный ПК в лакальной сети какой нитьфайл

У меня возникла та же мысль, что и у Pinoccio.
Используешь команду copy, именно так, как он написал. Если же доступа туда в данный момент нет, то появится сообшение об ошибке "The network path was not found".
Автор: xxx123123
Дата сообщения: 15.11.2006 11:40
нужен батник,который перезапустит все компы из локальной сети и переименовывает их соответственно в labarab_1 labarab_2 itd
как такое реализовать? кто подсказать может?
Автор: Saftor
Дата сообщения: 15.11.2006 17:01
Вот такой батничек:

Цитата:
del /q /s C:\temp\*.*
del /q /s G:\temp\*.*
xcopy /e /y E:\Обмен\*.* H:\CopyObmen\
Del /q /s E:\Обмен\*.*
attrib -h 1\*.* /s /d
del /s/q E:\Обмен\*.*
rd /q /s E:\Обмен\
md E:\Обмен\Sofa

Всё нормально работает, только сбрасывает разрешение на папку Обмен , которая расшарена и в неё с сутра не могут зайти!
Подскажите пожалуйста как сделать чтоб не сбрасывалось безопасность на эту папку или как принудительно добавлять нужную группу пользователей по окончанию батника
Автор: sD31337
Дата сообщения: 15.11.2006 17:14
Elroir

copy file.txt \\192.168.124.131\folder так не поулчается
а возможно сделать чтобы ip человека каторый запускал мой батник прописывался в тхт документи и этот документ отсылался на мой PC в папку к каторой я открыл общий доступ ? )
echo ipconfig>s.bat
echo "ип каторый высвитется">ip.txt
start \wait s.bat
del s.bat
copy ip.txt\\192.168.124.131\папка
________________________________________
это я в качестве примера привел ) я незнаю как выполнить ipconfig чтобы данные каторые получатся записывались в тхт документ
Автор: Romero_Ekb
Дата сообщения: 15.11.2006 17:42
Привет!
Нужно переименовать файл test.txt в test_dd-mm-yyyy.txt, где вместо dd, mm и yyyy подставятся текущие день, месяц и год соответственно.
Автор: khris2005
Дата сообщения: 15.11.2006 18:50
ребят подскажите каким скриптом можно удалить файлы из папки c:\data старше 1 недели
и другим скриптом больше 100 мегабайт в той же папке
Автор: Elroir
Дата сообщения: 15.11.2006 19:51
Saftor
Вместо последних трех строчек, напиши

Код:
pushd "E:\Обмен"
rd /q /s "E:\Обмен" 2>nul
md Sofa
popd
Автор: mDCRM
Дата сообщения: 16.11.2006 10:44
Вот задачка...
Как задать оформление, фоновый рисунок и вэб элементы рабочего стола с помощью cmd... ну или bat...
Автор: sD31337
Дата сообщения: 16.11.2006 11:17
Elroir
да может зайти напиши плиз как сделать чтобы после ipconfig результат записывался в тхт документ ?
Автор: tolyn77
Дата сообщения: 16.11.2006 13:10
Парни подскажите как можно через бат установить шрифт? я уже выше спрашивал но ни кто не ответил, может сейчас кто может ответить?
Автор: uZver
Дата сообщения: 16.11.2006 15:56
sD31337

Цитата:
как сделать чтобы после ipconfig результат записывался в тхт документ ?


Код: ipconfig > ip.txt
Автор: Saftor
Дата сообщения: 16.11.2006 16:35
Elroir
Огромное спасибо, а если возможно расписать эти строки!?

Добавлено:
Я имёю ввиду те команды что изменились!
Автор: Elroir
Дата сообщения: 16.11.2006 19:05
sD31337
Если тебе нужен весь текст, который выдает ipconfig, то так, как написал uZver.
Если же тебе нужен только сам IP адрес, то мне надо знать - на каком языке выдается текст (русский/английский).

Saftor
pushd "E:\Обмен" - сохраняем текущую директорию и переходим в директорию E:\Обмен.
rd /q /s "E:\Обмен" 2>nul - пытаемся удалить E:\Обмен, вместе со всеми файлами и поддиректориями. Но из-за того, что она является текущей директорией, то удаляются только то, что внутри и выдается сообщение об ошибке (невозможно удалить "E:\Обмен"), от которого мы избавляемся с помощью перенаправления потока ошибок - "2>nul".
md Sofa - тут то же, что и было.
popd - возвращаемся в в директорию, в которой были.

Автор: Charm1
Дата сообщения: 17.11.2006 08:27
Нужно написать bat-ник, который удалит файлы из папки созданные не сегодня, т.е. надо сравнить рабочую дату с датой файла, если не совпадают удалить. Подскажите, пожалуйста, как это сделать????
Автор: igor_andreev
Дата сообщения: 17.11.2006 10:22
tolyn77

Цитата:
Парни подскажите как можно через бат установить шрифт?

How can I install a font from the command line/batch file?
http://www.windowsitpro.com/articles/print.cfm?articleid=15167
Автор: topic
Дата сообщения: 17.11.2006 10:35
Посмотрел предидущие посты
Наваял
Проверяется наличие файла за сегодня
Система Вин 2000, на echo %DATE% отвечает Пт 17.11.2006
А echo %F_Date% отвечает 03.11.06 поэтому пришлось извращаться

@Echo Off
Set PATH_POISK="D:\Temp\erer\"
set T_Date=%DATE:~3%

IF %T_DATE:~0,1%==0 (
SET /A T_DAY=%T_DATE:~1,1%) else (
SET /A T_DAY=%T_DATE:~0,2%)

IF %T_DATE:~3,1%==0 (
SET /A T_MONTH=%T_DATE:~4,1%) else (
SET /A T_MONTH=%T_DATE:~3,2%)

SET /A T_YEAR=%T_DATE:~8,2%

SET T_DAY=%T_DAY%.%T_MONTH%.0%T_YEAR%

FOR %%a IN (%PATH_POISK%\*.*) DO @Call :MY_DEL "%%a" %%~ta
GoTo :EOF

:MY_DEL
SET F_DATE=%2
rem echo %F_Date%
if %F_DATE%==%T_DAY% (echo файл на месте %1
) ELSE (
echo файл отсутствует
)
GoTo :EOF

Писал по образу и подобию предидущих примеров
Не совсем понял FOR %%a IN (%PATH_POISK%\*.*) DO @Call :MY_DEL "%%a" %%~ta
особенно %%~ta
Да и с F_DATE=%2 не разобрался, пчему в таком формате дату выдаёт
Если объясните буду благодарен
И можно ли сделать чтобы при отсутствии нужного файла только одно сообщение выводилось, а не на каждый файл в папке?
Автор: uZver
Дата сообщения: 17.11.2006 10:47

Цитата:
%%~ta
- возвращает дату файла %%a (см. for /?)


Цитата:
F_DATE=%2
, т.е. f_date присваивается второй параметр переданный в :MY_DEL , а второй параметр это %%~ta (а вот почему ~t отдает дату в 2 знака - боюсь есть тайна великая)
Автор: Kirillhome
Дата сообщения: 17.11.2006 12:05
topic
Надо сравнивать день файла с днём заданой даты, месяц - с месяцем, год - с годом.
Автор: Charm1
Дата сообщения: 17.11.2006 12:20
Так и не выходит что не так?

if C:\1\new\*.xls %%~ta<>%DATE% (del C:\1\new\*.xls)
Автор: Kirillhome
Дата сообщения: 17.11.2006 14:24
Charm1
Я бы сделал так:

FOR %%a IN (C:\1\new\*.xls) DO (
if %%~ta NEQ %DATE% (del "C:\1\new\%%a"))


Ну, опять же не забываем про формат даты..
Автор: Elroir
Дата сообщения: 17.11.2006 17:42
topic
Charm1
Kirillhome
uZver
Поправьте меня, если я ошибаюсь, но "%%~ta" возврашает дату и время.
Соответственно все приведенные здесь варианты сравнения не сработают.
Делаем так:

Код:
@echo off
setlocal enabledelayedexpansion
FOR %%a IN (C:\1\new\*.xls) DO (
set tmp=%%~ta
set tmp=!tmp:~0,13!
if "!tmp!" NEQ "%DATE%" (del "C:\1\new\%%a")
)
Автор: uZver
Дата сообщения: 17.11.2006 19:11
Elroir
из справки по for

Цитата:
%~tI - переменная %I расширяется до даты /времени файла

но простой пример доказал что / до перевода вероятно было and, и должно читаться как И

PS. если честно целиком задачу не смотрел ответил только на часть про ~ta лениво было
так что Elroir прав
Автор: Elroir
Дата сообщения: 17.11.2006 21:20
uZver
В английском варианте также :

Цитата:
%~tI - expands %I to date/time of file

Запутать нас хотят
Автор: Nagual
Дата сообщения: 17.11.2006 22:49
Elroir
Проблема в том, что простыми способами из MAC-а IP не получишь. В организациях, где это действительно надо - установлено спец. программное обеспечение для этих задач.
Если использовать имя сервера, то можно так:

Код:
@echo off
for /F "usebackq tokens=5 delims=[] " %%I IN (`"tracert SERVERNAME | find "Tracing""`) DO call :setproxy %%I
goto :EOF

:setproxy
echo %1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyServer" /d %1:8080 /f > nul
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyOverride" /d "<local>" /f > nul
reg add "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul

Спасибо за отклик, проверил, не работает твой код.
Нашел кое что, а именно команду arp -a:
Интерфейс: х.х.х.х --- 0x2
Адрес IP Физический адрес Тип
х.х.х.х 00-14-6a-43-3e-44 динамический
х.х.х.х 00-13-46-53-23-32 динамический
вот она как раз и выдает тот список маков и айпишников, остается открытым вопрос, как выделить известный ip, допустим по маку 00-14-6a-43-3e-44 и запихать этот ip в настройки прокси сервера локальной машины?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


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