Четверг, 10.10.2024, 01:26
Ссылки на различные ресурсы в интернете.
Приветствую Вас Гость | RSS
Главная Примеры bat - Форум Регистрация Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: tang, XML  
Примеры bat
tang123Дата: Воскресенье, 31.08.2008, 18:36 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 68
Репутация: 0
Статус: Offline
http://forum.ru-board.com/topic.cgi?forum=62&topic=6156&start=0

http://rsdn.ru/article/winshell/batanyca.xml

http://www.comprice.ru/help/2005-17.phtml# администрирование сервера добавление пользователей.

 
tang123Дата: Вторник, 02.09.2008, 17:07 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 68
Репутация: 0
Статус: Offline
http://www.comprice.ru/help/2005-17.phtml# Уже не работает
http://www.comprice.ru/articles/detail.php?ID=40893&phrase_id=14038

Программируем bat.-файл!

Антон Климов
На написание этой статьи меня подбила очередная "разборка с Windows". В Windows XP есть замечательная штука - учетные записи пользователей, я выдал каждому родственнику по учетной записи и жил припеваючи. Но теперь нужно было заново переустановить Windows XP. А это значит, что все учетные записи потеряются...

Придется их всех заново создавать, обидно, хотя этих записей было меньше десятка, и сделать их все заново особого труда не представляло. Но это у меня десять, а в компьютерном зале, например, сто, как быть в таком случае? Да даже не сто, ввести 50 новых пользователей будет проблематично: надо все их запомнить или записать, а потом заводить каждого индивидуально. В Linux'е все данные о пользователях находятся в нескольких файлах, и их можно было бы просто скопировать, а вот в Windows все не так. Начал я искать выход из этого положения... и нашел. Впрочем, все по порядку.

В Windows XP есть интересная команда net user, с помощью которой можно увидеть все учетные записи, добавлять новые учетные записи и редактировать их. У этой команды есть куча параметров. А если, например, ввести net user admin, то мы увидим все данные о пользователе admin. Это подвигло меня написать специальную программку, запрограммировать bat-файл, который бы считывал всю информацию об учетных записях и куда-то записывал. Затем запрограммировать еще один bat-файл, который бы считывал информацию из файла и на ее основании восстанавливал бы все учетные записи. Но, чтобы это все провернуть, нужно было побольше узнать о самих bat-файлах.

В операционных системах семейства Windows команды объединяются в пакетные или командные файлы с расширением "bat". Эти файлы запускаются в консольном режиме командными интерпретаторами типа command.com и cmd.exe. Программирование bat-файлов идет на специальном языке операционной системы, и здесь, мне кажется, нужно указать смысл тех команд, которыми мы будем пользоваться.

Set - определение и присвоение начального значения переменной. Для получения значений переменной ее имя берут в скобки из символов "%". Команда echo - управляет выводом информации на экран. Echo off - команды не выводятся на экран, echo on - выводятся. Чтобы запретить вывод самой команды на экран, перед ней нужно поставить символ "@".

Начнем работу с создания второго командного файла (восстановление пользователей). Создаем в каталоге Works файл add_user.bat, именно в этом файле мы и будем писать программку. Его задача - считать данные из файла user_list и зарегистрировать в системе пользователей. Допустим, у нас есть такой текстовый файл user_list:

PetrovP Петров Петр 5А Класс 1111111
SidorovI Сидоров Иван 5А Класс 1111111
SpiridonovaK Спиридонова Катя 5А Класс 1111111
SemenovD Семенов Дима 5А Класс 1111111
..........................................

Первое слово каждой строки - login, второе и третье - полное имя, четвертое и пятое - класс и шестое - пароль. Все слова разделены пробелом (на картинке мы их разделили не одним пробелом для красоты). Пусть пароли у всех одинаковые и при входе в систему их должны поменять сами пользователи. Имя домашнего каталога для пользователя совпадает со строкой Login. Такая вот простая таблица, как из нее восстановить пользователей, да сделать каждому из них по личной папке в каталоге home? Да, проблемка, считать из файла строку, разобрать ее на составляющие слова и на основании их составить команду для регистрации.

Но проблемка решаемая, оказывается, командный интерпретатор поддерживает работу с оператором цикла "for". Для разбора строк в нем есть специальный формат: for /F ["СловаРазбора"] %%переменная in (имя_файла) do команда [ПараметрыКомСтроки]. "СловаРазбора" - это строка, которая может содержать следующие параметры:

eol - символ, стоящий в конце строки (по умолчанию символ конца строки - то, что получается, если нажать в редакторе клавишу "Enter");
delims - набор разделителей слов (по умолчанию пробел и символ табуляции);
tokens - задает элементы, выбираемые из строки и передаваемые в тело цикла for при каждой строке из файла. Форма m-n задает диапазон, указывающий элементы с m-го по n-ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента.
skip - число строк, пропускаемых при разборе. В нашем случае эта строка содержит лишь один параметр "tokens=1,2,3,4,5,6*", все остальные приемлемы по умолчанию (разделитель слов - символ пробела, окончание строки - символ возврата каретки).
%%переменная - это просто имя переменной, в которой будет храниться первое слово строки. В нашем случае это %%i (второе слово в переменной %%j, третье в %%k и т.д.).

Имя_файла - имя файла, из которого будут выбираться строки. Для нашей задачи это файл user_list.

Команда - это команда или набор команд в скобках, которые исполняются для каждой итерации цикла (для каждой строки из файла). То есть, цикл в нашем случае можно записать так: "for /F "tokens=1,2,3,4,5,6*" %%i in (User_list) do(".

Ну вот, с помощью этого цикла мы строчки из файла выбираем и по словам разбираем, и в переменные %%i, %%j, %%k, %%l, %%m заносим. Для того чтобы создать пользователя, существует команда net user, формат которой имеет следующий вид: net user Login Pass /add [Параметры] (более подробное описание приведено в справке Windows).

Login - имя пользователя (login)
Pass - назначаемый пользователю пароль
Параметры: /comment:"текст" - текст комментариев; /fullname:"имя" - полное имя пользователя; /homedir:путь - путь к домашнему каталогу и т. д.

Для того чтобы создать пользователя, нам следует выбрать следующий вид этой команды:

"net user %%i /add /comment:"%%l %%m" /fullname:"%%j %%k" /homedir:d:\home\%%i"

Осталось лишь создать каталоги пользователям и назначить им правильные права доступа (ах да, еще бы в группу включить). Для создания каталога используется стандартная команда mkdir, параметром которой является имя каталога и путь к нему (для нашей задачи это выглядит как "mkdir d:\home\%%i"). Назначаем права: для пользователя - изменения всего содержимого "C", для администратора - полный доступ "F". Для просмотра прав доступа или их установки используется команда cacls (CACLS имяФайла [/T] [/G|/P] [login:доступ]), где G - задать права доступа, P - изменить права доступа, ну и доступ - это {R - читать, W- писать, C - менять, F - полный доступ}. В нашем примере команда принимает вид: "cacls d:\home\%%i /T /G %%i:C /P admin:F". А для включения в группу есть команда net localgroup группа login/add (для нашего примера: net localgroup Пользователи %%i /add). И полный текст командного файла:

for /F "tokens=1,2,3,4,5,6*" %%i in (User_list) do (
net user %%i /add /comment:"%%l %%m" /fullname:"%%j %%k" /homedir:d:\home\%%i
net localgroup Пользователи %%i /add
mkdir d:\home\%%i
cacls d:\home\%%i /T /G %%i:C /P admin:F
)

Вот, вообщем-то, и все (при работе в сети localgroup заменяем на group), запускаем программу. В результате создаются пользователи, а в папке D:/home/ - личные папки для этих пользователей. А программа-то в несколько строчек.

Благодаря этому мы легко можем завести и пять, и пятьдесят пользователей, имея данные о них. Вы можете сделать программу так, что она будет абсолютно непохожа на мою, будет, например, записывать дни рождения пользователей. Для того чтобы она работала, нам нужно иметь лишь данные о пользователях.

А теперь попробуем записать эти данные из системы в файл (не на листочек же их нам выписывать). Для этого придется программировать новый bat-файл. Здесь мы введем несколько новых команд: "echo .... >> имя файла" - эта команда добавляет значение какой-либо переменной в конец определенного файла (если файла нет, то файл создается). Команда "Echo...> имя файла" создает новый файл, в который записывается только то значение, которое выводится командой echo.

Поскольку нам придется использовать несколько промежуточных файлов, то команда удаления файла "del имя файла" нам пригодится. Если мы хотим создать файл и в него много чего записать ("echo .... >> имя файла"), для начала удалим его, а вдруг он уже есть ("del имя_файла").

Для того чтобы собрать информацию о пользователях, нужно вначале создать файл, содержащий их "login'ы". Все наши пользователи находятся в одной группе "Пользователи" - имя у нее такое. Поскольку команда "net localgroup Пользователи" показывает не совсем то, что нам надо (она показывает и пользователей по умолчанию и пишет небольшое вступление), то мы должны несколько строчек в выдаче этой программы пропустить. Для этого используем команду skip=кол-во строчек "@for /F "skip=9 tokens=*" %%i in ('net localgroup Пользователи') do (". Так как и в конце она пишет не все, что нужно, то это будем отбрасывать (отбрасываем пустые строки и строки, начинающиеся со слова "команда" ) с помощью условных операторов:

@for /F "tokens=1" %%j in ("%%i") do (
@if not "%%j"=="" (
@if not "%%j"=="Команда" (

Ну а полученные данные просто пишем в файл users_users "echo %%j% >>users_users".

Первую часть программы разобрали. Она считывает данные, выдаваемые командой net localgroup, и записывает их в файл user_user.

Вторая часть программы выбирает только нужные нам данные из user_user и передает их в команду net user ("for /F "tokens=1" %%i in (users_users) do ( for /F "tokens=1,2,3,4" %%j in ('net user %%i') do ("). Эта команда выводит данные о пользователях.

Но среди этих данных нам нужно только "полное имя" и "комментарии" (отметим, что существуют еще и "комментарии пользователя", нам они не нужны).

Для выделения нужной информации используем if. Так, если первое слово в выводимой информации равно "Полное", то третье и четвертое слово из этой строки пишем в файл "bb" ("if "%%j"=="Полное" echo %%l %%m >bb"). А если первое слово в выводимой информации равно "Комментарии", но при этом второе слово не равно "пользователя" (иначе получится "комментарий пользователя", а он нам совсем не нужен), то мы записываем третье и четвертое слово в файл "cc". if "%%j"=="Комментарий" (if not "%%k"=="пользователя" echo %%k %%l >cc). Теперь у нас о каждом пользователе есть информация: переменная %%i - содержит login, а в файлах bb и сс находится полное имя и комментарии. Можно вносить это все в файл: "for /F "tokens=*" %%n in (bb) do ( for /F "tokens=*" %%o in (cc) do ( echo %%i %%n %%o 1111111>>user_list )) "

Теперь у нас есть файл с нужными данными - user_list. Удаляем ставшие ненужными файлы: "del cc del bb del users_users"

Полный текст программы выглядит так:

del users_users
@for /F "skip=9 tokens=*" %%i in ('net localgroup Пользователи') do (
@for /F "tokens=1" %%j in ("%%i") do (
@if not "%%j"=="" (
@if not "%%j"=="Команда" (
echo %%j% >>users_users
)
)
)
)
del user_list
for /F "tokens=1" %%i in (users_users) do (
for /F "tokens=1,2,3,4" %%j in ('net user %%i') do (
if "%%j"=="Полное" echo %%l %%m >bb
if "%%j"=="Комментарий" (if not "%%k"=="пользователя" echo %%k %%l >cc)
)
for /F "tokens=*" %%n in (bb) do (
for /F "tokens=*" %%o in (cc) do (
echo %%i %%n %%o 1111111>>user_list ))
)
del cc
del bb
del users_users

Имея три файла: user.bat - который снимает данные, user_list - в нем хранятся данные, и add_user.bat, мы можем значительно облегчить работу, особенно если пользователей очень много. Работайте, и пусть вам повезет!

Сообщение отредактировал tang - Суббота, 28.03.2009, 11:14
 
tang123Дата: Вторник, 02.09.2008, 17:11 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 68
Репутация: 0
Статус: Offline
http://forum.ru-board.com/topic.cgi?forum=5&topic=4582&start=220#4

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модераторуЗадача: сделать архивацию файлов внутри каталога. Обойти все каталоги. т.е в каждом каталоге должен быть идин файл типа имя_каталога.zip. Не работает следующий батник.
Подскажите.

REM Архивация всех файлов в подкаталогах любого уровня
FOR /R %%i IN (*.*) DO (
cd %%i
echo %%i
pkzipc.exe -add -max -header=@C:\!!\!\header.txt %%i *.*

REM ключ -move перемещает файлы в архив
cd ..
)

=================

rem mp3list.bat © HACSoft, 2005.
@echo off
echo Please wait...
mode con codepage select=1251 > nul
for /r %%d in (.) do (
cd %%d
if exist All.m3u del All.m3u
for %%f in (*.mp3) do echo %%f >> All.m3u
)
mode con codepage select=866 > nul

=================

 
tang123Дата: Воскресенье, 12.10.2008, 11:40 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 68
Репутация: 0
Статус: Offline
http://forum.ru-board.com/forum.c....B%E0%F5

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

 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024 Бесплатный хостинг uCoz