시간 초과 절차와 함께 PsInfo 사용(또는 PsExec를 통한 파이프?)

시간 초과 절차와 함께 PsInfo 사용(또는 PsExec를 통한 파이프?)

우리 회사 사람들은 주말에도 컴퓨터를 24시간 켜두는 문제가 있습니다. 우리 회사 정책은 사용하지 않을 때 시스템을 종료하는 것이지만 항상 그런 것은 아닙니다. 그래서 우리는 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에서 출력을 사용합니다. 그리고 마지막 부팅 시간에 대해 WMI를 폴링하고 다시 계산을 수행하는 powershell 명령으로 전환합니다. 모든 것이 지나치게 복잡해 보이며 다른 사람이 더 나은 제안을 하지 않는 한 쉽고 느린 솔루션을 선호합니다.

답변1

좋아요그렉의 제안마지막 부팅 시간을 얻으려면.

그러나 나는 다음이 당신이 요청한 것을 할 것이라고 믿습니다. 저는 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

관련 정보