У нас есть проблема с людьми в нашей компании, которые оставляют свои компьютеры работающими 24/7 даже в выходные дни. Наша корпоративная политика - отключаться, когда они не используются, но это происходит не всегда. Итак, что мы делаем, это запускаем простой скрипт с использованием 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 | find "Boot Time"
затем проанализируйте время загрузки и выполните математические вычисления, чтобы получить время выполнения. Получение старой копии 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