Преамбула:
Как то, в одной конторе нужно было бэкапить файловую базу а она в свою очередь хранилась на серваке, к серваку юзвери цеплялись терминальным клиентом и работали с 1С, понадобилось перед бекапом гасить юзеров, точнее выходить из их сеансов.
И вот был написан скриптик, который по времени перед бекапом выкидывает пользователей.
Скрипт, кстати, во вложении (точнее, 3 скрипта: выкинуть всех, выкинуть активных и выкинуть отключенных).
Как это работает на примере скрипта, который выкидывает всех пользователей:
- Формируем файл со списком созданных сессий;
query user >user_temp_all.txt
2. Убираем из файла строку со словом “console”, так как консольного юзера не нужно выкидывать;
find "console" user_temp_all.txt > user_temp.txt /V
3. Находим строки и со словом «Активно» (это чтобы в первый этап собрались сессии активные, почему сделано в два этапа, объясню дальше) и эти строки сохраняем в файл user.txt (кстати, это для руского сервака, если сервак другой, эту строку надо поправить, проверялось на 2008);
find "Активно" user_temp.txt > user.txt
4. Убиваем файл start.bat;
del start.bat
5. Вдруг никто не подключен, соответственно файл user.txt будет пустой, а файл скрипта нам нужен в любом случае, надо создать и написать что-то в файл, чтобы он смог запуститься;
@echo rem begin files start.bat>start.bat
6. Обработаем файл user.txt. Синтаксис команды for можно посмотреть по команде for /?, но расскажу по-быстрому: команда фор перебирает файл и разлаживает содержимое строки по переменным, ну и запускает для каждой строки команду, разберем начало for /f "skip=2 tokens=3," %%i
for в принципе сама команда, ключ /F означает перебрать и выполнить команду для каждой строки
параметр skip=2 означает, что пропустим 2-е первые строчки
параметр tokens=3 означает, что берем в строке 3-е значение, разделенное пробелами или «,» или «таб.» и помещаем его в переменную %%i
Разберем следующий кусок in (user.txt) DO echo logoff %%i >>start.bat
In (user.txt) означает, что перебираем файл user.txt
DO echo logoff %%i>>start.bat выполнить команду echo logoff %%i (сюда подставляется ид сеанса или значение переменной %%i) и результат добавить к файлу start.bat, команда эхо просто выводит в поток то, что написано после этого слова
7. Первый этап закончили, теперь нужно обработать неактивные сессии, допишем в файл start.bat строчку «echo rem NoAction session» просто чтобы видеть где закончился 1-й этап скрипта, так как файл start.bat не удаляется, то можно посмотреть что в нем было после запуска;
@echo rem NoAction session >>start.bat
8. Принцип второго этапа аналогичный первому, теперь в файле с сессиями ищем строки со словом «Диск», это те сеансы, которые отключены;
find "Диск" user_temp.txt>user.txt
- А вот теперь почему делали в два этапа. Просто файл сессий имеет следующий вид
И, как видно, из файла строка со статусом «Диск» не имеет Имя сеанса и соответственно в отключенном сеансе ID сеанса является 2-й переменной, если пробел считать разделителем, а при активном сеансе она является 3-й переменной, поэтому в первом этапе параметр tokens=3, а во втором этапе tokens=2, вот поэтому скрипт разбил на 2 части
for /f "skip=2 tokens=2," %%i in (user.txt) DO echo logoff ID %%i >>start.bat
9. Теперь убиваем лишние файлы
del user_temp.txt
del user.txt
10. Запускаем наш батник, который у нас получился, и результат работы выводим в файл log_logoff.txt
start.bat > log_logoff.txt
ВСЕ
З.Ы.: почему не убили все файлы? чтобы видеть, какие вообще были сеансы после запуска скрипта.