У нас проблема с людьми в нашей компании, которые оставляют свои компьютеры работающими круглосуточно, без выходных, даже по выходным. Наша корпоративная политика - отключаться, когда они не используются, но это происходит не всегда. Итак, что мы делаем, это запускаем простой скрипт с использованием PsInfo для восстановления работоспособности компьютеров. Мы экспортируем список компьютеров из AD в текстовый файл, затем с помощью командного файла просматриваем список, получаем информацию о времени безотказной работы и сохраняем ее в другом текстовом файле:
For /F "tokens=*" %%i in (ComputerList.txt) do psinfo uptime -nobanner \\%%i 1>>UptimeResults.txt
Отлично работает, но если компьютер не подключен к сети, тайм-аут по умолчанию составляет 60 секунд, что может привести к тому, что скрипт займет очень много времени на сотнях компьютеров. Сам PsExec имеет переключатель тайм-аута, который вы можете использовать, но PsInfo, похоже, не принимает это во внимание.Есть ли другой способ заставить его тайм-аут, скажем, через 10 секунд, или другую программу, которая будет делать то же самое? Возможно, использование PsExec напрямую с переключателем тайм-аута и какой-либо другой командой? Кстати, мы уже отключили fastboot, поэтому результаты по времени безотказной работы точны.
Мы обсуждали, но надеемся на более простое решение: Использование PsExec и запуск systeminfo | найдите «Время загрузки»
, затем проанализируйте время загрузки и произведите математические вычисления, чтобы получить время выполнения. Получение старой копии uptime.exe, ее развертывание на компьютерах и использование ее вывода с PsExec. И переключимся на команду PowerShell, которая будет опрашивать WMI на предмет последней загрузки, снова и снова, делать математику. Все они кажутся слишком сложными и предпочли бы простое, но медленное решение, если только у кого-то нет лучшего предложения.
Мне нравится предложение Грега получить последнее время загрузки.
Но я верю, что следующее сделает то, что вы просили. Я использую WMIC для запуска PSINFO в новом сеансе cmd.exe. FOR /F используется для захвата PID нового сеанса CMD. Затем я вызываю рутину для мониторинга процесса до 10 секунд. Если он больше не выполняется, то немедленно возвращайтесь. Но через 10 секунд я убиваю процесс, прежде чем вернуться.
Я протестировал процесс запуска и мониторинга с помощью манекена TIMEOUT. Но я не смог протестировать с PSINFO, так как у меня нет ни PSINFO, ни вашего окружения.
@echo off
setlocal
set "timeout=10"
set "log=UptimeResults.txt"
:: Start with an empty result file
copy /y nul %log% >nul
:: Loop through the list of computers
for /f "tokens=*" %%i in (ComputerList.txt) do (
%= For each computer, launch PSINFO via wmic and use FOR /F to capture the parent cmd.exe session PID =%
%= The cd argument is the location where the process should run (current directory) =%
for /f "tokens=2 delims=;= " %%P in (
'wmic process call create 'cmd /c "psinfo uptime -nobanner \\%%i 1>>%log%"'^, "%cd%" ^| find "ProcessId"'
) do call :monitor %%P 2>nul 1>nul
)
exit /b
:monitor PID
:: Monitor up to %timeout% seconds and return immediately if process no longer running
for /l %%N in (1 1 %timeout%) do (
timeout 1
tasklist /fi "pid eq %1" | find "cmd.exe" || exit /b
)
:: It has been longer than %timeout% seconds, so kill the process
taskkill /pid %1 /f /t
exit /b