AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 998740
Accepted
ADY
ADY
Asked: 2020-01-14 08:50:30 +0800 CST2020-01-14 08:50:30 +0800 CST 2020-01-14 08:50:30 +0800 CST

将 PsInfo 与超时过程一起使用(或通过 PsExec 进行管道传输?)

  • 772

我们公司的员工即使在周末也让他们的计算机 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 上次启动时间并再次进行数学运算。一切似乎都过于复杂,除非其他人有更好的建议,否则宁愿使用简单但缓慢的解决方案。

windows
  • 1 1 个回答
  • 498 Views

1 个回答

  • Voted
  1. Best Answer
    dbenham
    2020-01-14T12:45:41+08:002020-01-14T12:45:41+08:00

    我喜欢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
    
    • 2

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve