我们公司的员工即使在周末也让他们的计算机 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,也没有您的环境。