.png)
У нас есть проблема с людьми в нашей компании, которые оставляют свои компьютеры включенными 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 на предмет последнего времени загрузки и снова выполнять математические расчеты. Все это кажется слишком сложным и предпочел бы простое, но медленное решение, если только кто-то другой не предложит лучшее.
решение1
Мне нравитсяПредложение Грегачтобы узнать время последней загрузки.
Но я считаю, что следующее сделает то, о чем вы просили. Я использую 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