將 PsInfo 與超時過程一起使用(或通過 PsExec 進行管道傳輸?)
我們公司的員工即使在周末也讓他們的電腦 24/7 全天候執行,我們對此有疑問。我們的公司政策是在不使用時關閉,但這並不總是發生。所以我們一直在做的是使用 PsInfo 執行一個簡單的腳本來拉回電腦的正常執行時間。我們將電腦列表從 AD 導出到文本文件中,然後使用批處理文件瀏覽列表,提取正常執行時間資訊,並將其保存到另一個文本文件中:
For /F "tokens=*" %%i in (ComputerList.txt) do psinfo uptime -nobanner \\%%i 1>>UptimeResults.txt
效果很好,但是如果電腦不線上,預設超時似乎是 60 秒,這可能會導致腳本在數百台電腦上花費很長時間。PsExec 本身有一個可以使用的超時開關,但 PsInfo 似乎沒有考慮到這一點。是否有另一種方法可以在 10 秒後強制它超時,或者使用不同的程序來做同樣的事情?可能直接將 PsExec 與超時開關和其他命令一起使用?附帶說明一下,我們已經禁用了快速啟動,因此正常執行時間結果是準確的。
我們已經討論過但希望有一個更簡單的解決方案:使用 PsExec 並執行,
systeminfo | find "Boot Time"
然後分析啟動時間並進行一些數學運算以獲得執行時間。獲取 uptime.exe 的舊副本,將其部署到電腦,並將其輸出與 PsExec 一起使用。並切換到一個 powershell 命令,該命令將輪詢 WMI 上次啟動時間並再次進行數學運算。一切似乎都過於復雜,除非其他人有更好的建議,否則寧願使用簡單但緩慢的解決方案。
我喜歡Greg 關於獲得最後一次啟動時間的建議。
但我相信以下內容會滿足您的要求。我使用 WMIC 在新的 cmd.exe 會話中啟動 PSINFO。FOR /F 用於擷取新 CMD 會話的 PID。然後我呼叫一個常式來監控這個過程長達 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