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

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

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


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

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

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

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

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

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

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


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


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


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

· 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 - выводит входящие данные на экран и в файл (одновременно)
· 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-файлах
[/more][/b]


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

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


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

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


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

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


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

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


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

Описания работы команд и символов участниками темы:
· setlocal enabledelayedexpansion и переменные окружения
· символы & и && в командной строке
· Переменная %0
Автор: king_stiven
Дата сообщения: 11.09.2007 14:31
popalka


Код: mode con codepage select=1251 > nul
Title y
cmdow "y" /HID
set month=092007
for /f "usebackq tokens=2,3,5 delims=. " %%d in (`dir /t:c /s /o:d /a:-d E:\russian\`) do if %%d%%e EQU %month% call :folding "%%f"
setlocal enabledelayedexpansion
echo !sum!>>2.txt
goto :eof
:folding
for /f "usebackq tokens=1,2,3,4" %%g in ('%~1') do (
set "n=%sum%"
set /a sum+=%%g%%h%%i%%j
set m=%%g%%h%%i%%j
)
if %sum% LSS 0 (
echo %n%>>2.txt
set sum=%m%
)
Автор: VovaII
Дата сообщения: 11.09.2007 15:29
Люди, вопрос.
Есть сетка с виндовским доменом. Есть юзеры в домене. Есть файл-сервер с кучей папок для разных групп юзерей, и общими папками.
Возможно ли как-то не вручную перебрать файлы и понаходить какие какому юзеру принадлежат? Или понаходить только те, что принадлежат определенному юзеру(чтоб логин задавать можно было)?
Автор: Elroir
Дата сообщения: 11.09.2007 15:41
ilovevirus

Цитата:
Хотелось бы:
1. увеличить скорость обработки за счет, не копирования, а удаления строк в заданном файле.
2. возникает проблема подсчета пустых строк, во-первых они не учитываются, во-вторых вместо них в новом файле идут строки - "echo off".
3. не могу выйти из цикла, когда нужная строка найдена, необходимо прервать цикл, что-то типа exit for, break, exit /b ....

1. Сложно - даже с дополнительными утилитами (хотя sed наверняка может).
В моем варианте скорость обработки достаточно высокая.
2. В коде ниже нет такой проблемы.
3. Смотри код ниже.

Код:
@echo off
setlocal
set "before_date=02.09.2007"
for /f "delims=[] tokens=1" %%a in ('type "%~1" ^| find /n "%before_date%"') do (set /a "line=%%a-1" & goto continue)
:continue
if defined line more +%line% "%~1" > "%~n1_new%~x1"
Автор: popalka
Дата сообщения: 11.09.2007 15:42
king_stiven, Elroir

спасибо!
Автор: Elroir
Дата сообщения: 11.09.2007 16:11
VovaII
http://www.windowsitpro.com/Files/07/41504/Listing_01.txt
Автор: GORA2
Дата сообщения: 11.09.2007 18:45
vserd
Выберите:
Языковые стандарты и Форматы: Английский (США)
Формат времени: hh:mm:ss tt
Формат даты: dd-MMM-yy
и запустите ваш пример вызова процедуры:

Код: setlocal
(Call :GetDateTime Dyear Dmonth Dday DHour DMinute DSec Dmsec)&&set ttt=
Echo.
Echo GetDateTime Dyear=%Dyear% Dmonth=%Dmonth% Dday=%Dday% DHour=%DHour% DMinute=%DMinute% DSec=%DSec% Dmsec=%Dmsec%
endlocal
Автор: ilovevirus
Дата сообщения: 12.09.2007 01:50
Elroir
Большое Спасибо!

Добавлено:
Еще один вопрос: Подскажите как можно послать команду по сети на определенный порт?
Автор: doctorZlo
Дата сообщения: 12.09.2007 17:15
Народ помогите решить задачку! Никак немогу придумать, как ее решить
Надо написать батничек, чтобы при его выполнении текстовый файл, допустим 1.txt который содержит ряд значений вида ({знач1;знач2;знач3;знач4}-переменные записаны в строчку через разделитель " ; ")-- записывал эти значения в другой текстовый файл,допустим 2.txt, но на определенные место, тобишь повставлял на определенные строки файла?
Автор: Elroir
Дата сообщения: 12.09.2007 17:25
doctorZlo
Приведи пример файла 1.txt и файла 2.txt до и после подстановки.

Добавлено:
ilovevirus
Видимо тебе нужна утилита вроде netcat (nc.exe). Ссылка на нее есть в шапке, в разделе "Полезные утилиты"
Автор: king_stiven
Дата сообщения: 12.09.2007 17:56
popalka

Вот такое есть решение, корректно считает сумму файлов до 2 с чем то терабайт. Почему то время от время попикивает.) Можно задать промежуток времени созданмя файлов:
set month_begin=20070601
set month_end=20070630
где суммируются размеры файлов, созданных с 01 06 2007 до 15 07 2007

Код: @echo off
mode con codepage select=1251 > nul
set month_begin=20070601
set month_end=20070715
del "%temp%\2.txt"
for /f "usebackq tokens=1,2,3,5 delims=. " %%c in (`dir /t:c /s /a:-d`) do (
if %%e%%d%%c GEQ %month_begin% (
if %%e%%d%%c LEQ %month_end% call :folding "%%f"
)
)
setlocal enabledelayedexpansion
echo !sum!>>"%temp%\2.txt"
call 3.bat
goto :eof
:folding
for /f "usebackq tokens=1,2,3,4" %%g in ('%~1') do set /a sum+=%%g%%h%%i%%j
echo %sum%
if %sum% LSS 0 (
for /f "usebackq tokens=1,2,3,4" %%g in ('%~1') do call 2.bat %%g%%h%%i%%j
set big_size=yes
)
Автор: doctorZlo
Дата сообщения: 12.09.2007 18:48
Elroir

Цитата:
Приведи пример файла 1.txt и файла 2.txt до и после подстановки.

В файле 1.txt прописы следующие значения:
user;kovbasyuk2;10.4.145.85
А вот эти значения после подстановки их в файл 2.txt:
[more]
......
......

[Filters]
......
......
10.4.145.85=0; 0;

[FiltersW]
......
......
10.4.145.85=0; 0;

[UsersAddr]
g00000001=
......
......
g00000000=
........
........
10.4.145.85=


[Users]
........
........
10.4.145.85=kovbasyuk2; *; ; 0; 0; 0; 0; 0; 0; 0; 1-24/1-24/1-24/1-24/1-24/1-24/1-24/; 0; 0; 0; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 1; 0; 0; 0; 0; 0; 0; 1;
[/more]


Но тут есть одино но! В зависимости от того, какое значение (user/moder) стоит в файле 1.txt айпишник этого чела в файле 2.txt в закладке [UsersAddr] должен находиться либо за флагом g00000001= {moder}, либо за g00000000= {user}


Автор: Elroir
Дата сообщения: 12.09.2007 23:32
doctorZlo
Попробуй этот код:

Код:
@echo off
setlocal
del /q /f tmp.txt 2>nul
set "input=1.txt"
set "output=2.txt"
for /f "delims=; tokens=1-3" %%a in (%input%) do call :write "%%a" "%%b" "%%c"
ren "%output%" "%output%.bak"
ren tmp.txt "%output%"
goto :EOF
:write
if /i "%~1"=="moder" (set "insert_before=g00000000=") else (set "insert_before=[Users]")
for /f "tokens=*" %%A in (%output%) do (
if "%%A"=="[FiltersW]" (
echo %~3=0; 0;>>tmp.txt
echo [FiltersW]>>tmp.txt
) else if "%%A"=="[UsersAddr]" (
echo %~3=0; 0;>>tmp.txt
echo [UsersAddr]>>tmp.txt
) else if "%%A"=="%insert_before%" (
echo %~3=>>tmp.txt
echo %insert_before%>>tmp.txt
) else echo.%%A>>tmp.txt
)
echo %~3=%~2; *; ; 0; 0; 0; 0; 0; 0; 0; 1-24/1-24/1-24/1-24/1-24/1-24/1-24/; 0; 0; 0; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 1; 0; 0; 0; 0; 0; 0; 1;>>tmp.txt
Автор: dardreams
Дата сообщения: 13.09.2007 09:21
Привет !!!
Я знаю что тут лучшие потому что не раз мне уже помогали решать мои никому нужные задачки. Вот придумал еще чем заняться надеюсь решим....

допустим это find2.cmd

Код:
find /i %1 %2
Автор: Maza Faka
Дата сообщения: 13.09.2007 10:29
dardreams
Если передаваемый аргумент содержит пробелы, то используй двойные кывычки:

Код:
find2.cmd d:\ "король и шут"
Автор: popalka
Дата сообщения: 13.09.2007 20:23
king_stiven, спасибо
Автор: dardreams
Дата сообщения: 14.09.2007 06:24
Maza Faka
Насчёт кавычек я знаю.. меня этот вариант не устраивает. а вот за SHIFT спасибо !
Автор: PAtr1ck
Дата сообщения: 14.09.2007 09:33
Народ помогите пожалуйста решить такую задачу: надо чтобы по имени компа цеплялись общедоступные ресурсы и принтеры например: компьютер наз: BFU чтоб ему цеплялись личная папка BFU и принтер
Автор: doctorZlo
Дата сообщения: 14.09.2007 09:42
Elroir, спасибо.
Автор: vserd
Дата сообщения: 14.09.2007 11:43
GORA2

Цитата:
Языковые стандарты и Форматы: Английский (США)
Формат времени: hh:mm:ss tt
Формат даты: dd-MMM-yy

Спасибо за багрепорт, исправил, обновил
DateCMD.Bat http://www.rapidshare.ru/401179
Автор: veryom
Дата сообщения: 15.09.2007 00:07
PAtr1ck

Цитата:
Народ помогите пожалуйста решить такую задачу: надо чтобы по имени компа цеплялись общедоступные ресурсы и принтеры например: компьютер наз: BFU чтоб ему цеплялись личная папка BFU и принтер

Предположения: Сеть Windows, AD.
Пиши стартап или логон скрипт. WMI тебе в помощь. Удачи!
Автор: PAtr1ck
Дата сообщения: 15.09.2007 09:45
Спасибо! за ответ просто я незнаю как писать скрипты.. поэтому и спросил
Автор: veryom
Дата сообщения: 15.09.2007 12:22
PAtr1ck

Цитата:
надо чтобы по имени компа цеплялись общедоступные ресурсы и принтеры

Вообще-то шары цепляют по имени пользователя, а не компа. Посмотри здесь:vbs logon скрипт для подключения сетевых дисковHow Can I Map Drives Based on Membership in a Group?Автоматизация администрирования. Часть 2



P.S. Поиск рулит!
Автор: euheny
Дата сообщения: 16.09.2007 07:52
А кто-нибудь знает замену devcon.exe ?
Автор: Elroir
Дата сообщения: 16.09.2007 12:40
euheny
Смотря что тебе нужно сделать...
Автор: Smitis
Дата сообщения: 16.09.2007 21:37
euheny

Цитата:
А кто-нибудь знает замену devcon.exe ?

"Диспетчер устройств"
Автор: euheny
Дата сообщения: 16.09.2007 23:23
Elroir


Код: [no]C:\>devcon help install
devcon [-r] install <inf> <hwid>
Manually installs a device.
This command will only work for local machine.
Specify -r to reboot automatically if needed.
<inf> is an INF to use to install the device.
<hwid> is a hardware ID to apply to the device.[/no]
Автор: Elroir
Дата сообщения: 17.09.2007 00:28
euheny
Если надо установить .inf файл для устройства, можно сделать так:

Код: rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 driver.inf
Автор: Nagual
Дата сообщения: 17.09.2007 01:00
такая задача
надо забрать из реестра путь к программе с произвольным числом пробелов
путь примерно такой
C:\Program Files\AAA Software\AAA\Skin
делаю так
for /f "tokens=3,*" %%a in ('reg query "HKLM\SOFTWARE\AAA Software\AAA\Skin" /v Skin') do echo %%a
получаю C:\Program, а надо C:\Program Files\AAA Software\AAA\Skin
может кто знает более изящное решение?
Автор: Elroir
Дата сообщения: 17.09.2007 01:07
Nagual
Чуть-чуть подправь команду :

Код: for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\AAA Software\AAA\Skin" /v Skin') do echo %%b

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: Доступ к реестру через RegEdit?


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