Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перезапуск устройства (http://forum.oszone.net/showthread.php?t=327271)

svoping 01-06-2017 23:22 2741477

Перезапуск устройства
 
Всем доброго времени суток.
Прошу помочь с созданием батника.
После входа в Windows я запускаю батник с помощью планировщика задач. В корне диска "C" располагается файл "erorrlog.txt". Сам батник должен работать следующим образом:
1. Получить дату изменения файла "erorrlog.txt"
2. Присвоить полученное значение даты изменения файла "erorrlog.txt" переменной "Х"
3. Цикл: получить дату изменения файла "erorrlog.txt" и сравнить с переменной "Х", если равно, то снова получить дату изменения файла "erorrlog.txt" и сравнить с переменной "Х", если нет, то отключить устройство, ID которого "DEVICE_ID", далее скорее всего нужна будет задержка на 3 сек, затем включить это же устройство.
4. Вернуться в пункт 1.

Iska 02-06-2017 01:17 2741497

svoping, не пишите, что и как должен делать «батник» — переменные, файлы в корне системного раздела, циклы, задержки и т.п. Опишите Вашу задачу.

greg zakharov 02-06-2017 09:10 2741521

Iska, попробую телепатировать что же svoping имел ввиду: если работа некого устройства завершилась с ошибкой, эта ошибка пишется в лог, изменяя тем самым время модификации самого лога; последнее является отправной точкой для установления факта неправильной работы устройства, посему его надобно перезапускать. Если телепатия не подвела, то, во-первых, лучше отказаться от затеи плодить текстовые файлы в корне диске (в идеале и вовсе запретить создавать что-либо в корне диска за исключением папок - безопасность, какбэ), а логирование перенести в журнал событий (если не ошибаюсь, это можно сделать sysmon'ом), а смотреть psloglist'ом соответсвующий журнал: если ошибка есть - devcon в помощь. А вообще, если устройство представлено каким-то сервисом в системе, то проще в services.msc выставить автоматический перезапуск службы при возникновении ошибки. На этом телепатия заканивается.

svoping 02-06-2017 09:51 2741527

Имеем некую программу предназначенную для работы с определенным устройством. Устройство подключено по USB(эмуляция com-порта). Программа обращается к устройству, и если не получает ответа от него, то вносит информацию об ошибке в файл "erorrlog.txt", изменяя тем самым время модификации самого лога; последнее является отправной точкой для установления факта неправильной работы устройства, посему его надобно перезапускать."
Вот окончательный вариант
Про диск C понял, его я указал лишь, для примера, на самом деле "erorrlog.txt" будет храниться С:\DEVICE\erorrlog.txt

greg zakharov 02-06-2017 10:20 2741532

Гонять цикл в командном сценарии (а ведь задача то и подразумевает) в данном случае не самое лучшее, что можно выдумать. Берете PowerShell, натравливаете FileSystemWatcher на нужный файл и в сущности - все. Если файл был изменен, перезапускаем USB'ека через devcon. Что-то в этом роде. Время трошки освободится, напишу подробнее.

svoping 02-06-2017 19:54 2741701

Товарищи решение на PowerShell не совсем удобно, так как парк ПК большой, и достаточно много, около 20 ПК, на которых стоит Windpws XP

Iska 02-06-2017 22:09 2741729

Цитата:

Цитата svoping
и достаточно много, около 20 ПК, на которых стоит Windpws XP »

Это: а) не «много», и б) есть PowerShell 2.0, который работает и на Windows XP.

P.S. Если никак не хотите PowerShell, то, если хорошо попросите коллегу greg zakharov, он Вам сделает и отдельный исполняемый модуль с потребным функционалом.

greg zakharov 02-06-2017 22:19 2741733

Цитата:

Цитата svoping
Товарищи решение на PowerShell не совсем удобно

Неудобно - это когда соседские дети на тебя похожи или когда пытаешься решать проблемы на работе за чужой счет, вот это неудобно. Ничто не мешает по сетке развернуть PS (на ХР потолок - вторая версия, но ее хватит более чем), чай ведь сам установочный пакет в виде КВ распространяется. Но раз джинсы жмут в интимных местах, то берете пять сотен и переводите их мне на счет devcon (его сирано также придется раскидать по сети), а далее ваяете нечто вроде:
Скрытый текст
Код:

@echo off
  setlocal enabledelayedexpansion
    set "log=D:\src\foo"
    :monitor
      call:sleep 3
      call:getstamp !log!
      goto:monitor
  endlocal
exit /b

:getstamp
  for /f %%i in ("%~1") do set "ts=%%~ti"
  if not defined x set "x=!ts!"
  if /i "!ts!" equ "!x!" (
    echo:same
  ) else (
    echo:not same
    <nul set /p="Restarting USB device "
    rem сюбственно, здесь реализуется логика перезапуска
    set "x=!ts!"
    echo:[at !time:~0,-3!] . . . OK
  )
exit /b

:sleep
  echo:%~1|>nul findstr /xrc:"[0-9].*"&&(
    if %~1 equ 0 goto:break
    set /a "s=%~1/2+1"
    w32tm /stripchart /computer:localhost /period:1^
      /dataonly /samples:!s!>nul
    <nul set /p="Standby . . . "
  )||(
    :break
    rem
  )
exit /b


В теории жонглировать USB'еками можно через WMI, а именно Win32_USBControllerDevice. Насколько помню там есть метод Reset, но вроде бы он как не реализован в ранних версиях Windows. Проверять, честно говоря, не хоцца. Так что... вектор Вам указали.
Цитата:

Цитата Iska
если хорошо попросите

И то возможно.

alpap 03-06-2017 10:12 2741793

svoping,
если хотите или удобнее контролировать по дате изменения, то можно и так. В коде дата изменения файла запишется при первом запуске во временный файл и она же будет записываться и при следующих запусках, но как только поменяется - будет выведена строка "Отключаем" и удаляется временный файл (паузу в рабочем варианте можно убрать), реальное отключение думайте как сделать:
Код:

@echo off
call :# "errorlog.txt"
pause& exit

:#
 if exist tmp <tmp set/p dw=
 if not "%~t1"=="%dw%" (
  echo Отключаем& pause& del tmp& exit
 ) else (
  >tmp echo %~t1
 )
exit /b

errorlog.txt: мне показалось что именно такое имя должно было бы быть против erorrlog.txt
минус в том что один раз вначале надо запустить, рабочий процесс будет идти со второго запуска


Время: 21:16.

Время: 21:16.
© OSzone.net 2001-