예정된 종료 전에 남은 시간?


8

Windows 7에서 예정된 종료 전에 얼마나 많은 시간이 남아 있는지 확인할 수있는 방법이 있습니까?

예약 된 종료라는 말은 명령 줄 shutdown.exe응용 프로그램을 사용하여 예약 된 종료 (또는 다시 시작)를 의미합니다 . 예 :

shutdown /t 600 /s

종료까지 10 분이 걸리고 실제 시스템 종료 시간이 표시되는 메시지 상자가 나타납니다.

600초 보다 긴 시간 은 풍선 메시지를 대신 사용합니다.

카운트 다운과 함께 GUI 진행 모니터를 제공하는 XP를 모호하게 기억합니다.

그들은 어떻게 작동 했습니까? 종료 시간 또는 예약 된 시간은 어딘가에 저장해야합니다. 어떻게 액세스 할 수 있습니까?

선호하는 것은 커맨드 라인을 통한 방법입니다 (예 : 비 GUI). 더 중요한 것은 Windows 내에서, 즉 타사 프로그램없이이 작업을 수행 할 수 있습니까?

표준 Windows 유틸리티를 사용하여이 작업을 수행 할 수없는 경우 (여기서는 스택 오버플로 영역에 경계가있는 경우) Windows API (또는 PowerShell에서도 사용할 수있는 .NET) 기능이 있습니까? 임의의 타사 프로그램보다 선호됩니다.


superuser.com/a/317062/117590 은 유망 해 보였지만, 주석 ( /c <time>) 을 추가 할 때 종료 명령을 수정하지 않는 것이 바람직합니다 .

배치 파일을 작성하는 것이 어렵지 않을 것이라고 생각합니다. 시간 동안 프롬프트가 표시되고 5 분마다 IE "10 분 남음"으로 응답 할 수 있습니다. 1에 도달하면 초 또는 무언가.
cutrightjm

카운트 다운이 필요하지 않습니다. <this>에 남은 시간을 가져 오는 방법이 필요합니다. 외부 프로그램이 종료 명령을 호출하고 있습니다.
Bob

답변:


5

질문이 흥미로워 서 당신을 위해 일할 수있는 배치썼습니다 .

기본적으로 카운트 다운 타이머 shutdown입니다.이 명령을 포함하지 않았지만 숙제로 남겨 두었습니다. 계산이 정확하지 않으며, 윤년, 월 길이에 신경 쓰지 않습니다 ... 이것은 주로 배우기 쉽도록 읽기 쉽도록하기위한 것입니다.

현재 작업을 수행하는 두 개의 파일이 있습니다. 하나는 타이머를 시작하고 다른 하나는 호출되면 타이머가 시작한 후 경과 한 시간을 알려줍니다. 이 두 파일은 하나의 cmd 스크립트로 상당히 쉽게 결합 할 수 있으므로, 정의 된 메소드와 같은 일부 행도 재사용 할 수 있습니다.

자, 스크립트를 살펴 봅시다.

여기 있습니다 StartTimer.cmd:

@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
  SET DateD=%%a
  SET TimeH=%%b
  SET TimeM=%%c
  SET DateM=%%d
  SET TimeS=%%e
  SET DateY=%%f
)
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
ECHO %EPOCH% > Timer.start.state

라인 시작 FOR /F "skip=1 ...:
1.wmic 현재 시간과 날짜를 요청 하십시오 .
2. 표제 인 출력의 첫 번째 행을 skip=1
3 씩 건너 뜁니다 . tokens=1-6%%a-%%f구분 된 의미를 사용하여 값을 읽 습니다 SpaceorTAB.
4. 변수 값을 저장 %DateY%, ... %TimeH%, %TimeM%, ...

그 후 라인 시작에서 SET /A EPOCH=...우리는 경과 초1.1.1970 를 계산하는 표현식을 사용합니다 ( 이것은 실제 유닉스 시간이 아니라 대략적인 것입니다. 정확한 정보가 필요한 경우 Google 참조 ).

그런 다음 마지막 줄에서 ECHO %EPOCH% > ...계산 된 시간을 " Timer.start.state" 파일에 기록 합니다.

그리고 여기 GetTimerValue.cmd:

@ECHO OFF

GOTO CHECKFILE

:TIMEOUT
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /P Timer=<"Timer.start.state"
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
SET /A Elapsed=%EPOCH%-%Timer%
ECHO "Seconds since timer started: %Elapsed%"
GOTO EOF

:CHECKFILE
IF EXIST "Timer.start.state" (
  GOTO TIMEOUT
) ELSE (
  ECHO "Timer not started. Start timer by running Timer.cmd"
)

:EOF

여기에서 코드 흐름은 위에서 아래로 선형이 아닙니다. 먼저 GOTO CHECKFILE레이블을 지정하여 실행 명령이 실제로 시작되는 줄에서 시작합니다 :CHECKFILE. 여기의 많은 것들과 똑같 StartTimer.cmd으므로 새 줄이나 변경된 줄만 설명합니다.

먼저 상태 파일 Timer.start.state이 존재 하는지 확인 하고 그렇지 않은 경우 wit 메시지를 종료하십시오. 타이머가 시작되고 파일이 존재하면 계속해서 수학을 수행합니다.
1.:TIMEOUT 경과 된 초를 출력 하는 곳으로 이동합니다 . 더 나은 레이블을 선택할 수 있습니다 ...
2. SET /P %Timer% ... 파일에서 시작 시간을 읽고 %Timer%변수에 값을 할당 합니다.
3. SET /A Elapsed ... 시작 시간과 지금 사이의 초를 계산합니다.
4. ECHO "Seconds ... 계산 된 값을 에코합니다 (타이머 시작 이후 초).

남은 시간을 얻는 방법 :

%Elapsed%에서 빼기 %MaxTime%:

@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"

알았어 전체 스크립트는 다음과 같습니다 Timer.cmd.

이 시점에서 이미 말한 모든 것을 잊어 버렸습니다. 이 배치 파일은 자체적으로 작동하므로 별도 StartTimer.cmd또는이 GetTimerValue.cmd것이 아닙니다 Timer.cmd. 기본적으로 여전히 동일하지만 코드 흐름이 다르며 사용법도 완전히 다릅니다. 그러나 이것은 상태를 파일에 저장하지 않으므로 위의 사용 예제가 파일과 상태를 저장하거나 읽을 때 로그 오프 / 재부팅 후 타이머 값을 더 이상 얻을 수 없습니다.

Timer.cmd인수없이 실행하면 사용법 / 도움말 이 인쇄됩니다. 나는 이것을 완전히 테스트하지 않았으며 오타 등이있을 수 있습니다.

@ECHO OFF

GOTO TimerUser%1

:: ===================================
:: Operation is start, (re)start timer
:: ===================================
:TimerUserstart
ECHO %2 | FINDSTR /R "^[1-9]"
IF %ERRORLEVEL%==0 (
  SET Timer.max=%2
  GOTO TimerStart
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   You must specify maximum value.
  ECHO   ===============================
  GOTO TimerUser
)

:: =============================================
:: Operation is get, get values if timer running
:: =============================================
:TimerUserget
IF DEFINED Timer.start.state (
  GOTO TIMEOUT
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   Timer is not started, start timer first.
  ECHO   ========================================
  GOTO TimerUser
)

:: ============
:: Usage / Help
:: ============
:TimerUser
  ECHO.
  ECHO Timer.cmd Usage: Timer.cmd operation [options]
  ECHO.
  ECHO - Operations
  ECHO   start    Start new timer, n must be specified.
  ECHO   get      Get current value of started timer.
  ECHO.
  ECHO - Options:
  ECHO   n        Max value in seconds, used to calculate remaining time.
  ECHO.
GOTO EOF

:: =============================
:: Update %Timer.epoch% variable
:: =============================
:TimerUpdateEpoch
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /A Timer.epoch=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
GOTO %Timer.Callback%

:: ===========================================
:: Start new timer destoying/resetting old one
:: ===========================================
:TimerStart
SET Timer.Callback=TimerStartC1
GOTO TimerUpdateEpoch
:TimerStartC1
SET Timer.start.state=%Timer.epoch%
GOTO EOF

:: =============================
:: Echo out current timer values
:: =============================
:TIMEOUT
SET Timer.Callback=TimerEchoJ1
GOTO TimerUpdateEpoch
:TimerEchoJ1
SET /A Timer.elapsed=%Timer.epoch%-%Timer.start.state%
SET /A Timer.remaining=%Timer.max%-%Timer.elapsed%
ECHO "Seconds since timer started: %Timer.elapsed% Time remaining %Timer.remaining%"
GOTO EOF

:EOF

shutdown다른 명령 과 통합 하거나 다른 명령을 통합하십시오 .

파일 poweroff.cmd:

@ECHO OFF
Timer start %1
shutdown -t %1 -s

사용법 : poweroff <wait_seconds>시간 종료를 시작하고 Timer get경과 / 남은 시간을 확보합니다.


노력에 박수를 보냅니다. 방금 질문이 얼마나 잘못 표현되었는지 깨달았지만 여전히 대답 할 수있었습니다. 그것을 위해 당신은 공감대를 얻는다. 불행히도, 이것은 임의의 종료 명령과 함께 작동하지 않습니다 StartTimer.cmd. 즉, 명시 적으로 호출해야합니다. 내 문제를 해결하기 위해 작은 프로그램을 작성했는데 컴퓨터로 돌아올 때 게시 할 것입니다.
Bob

좋아, 나는 이것을 받아 들일 것이다. 나는 지명되었다 C # 프로그램 작성 결국 shutdown.exe라고 shutdown_original.exe. 그것은 확인 할 /t플래그가 존재하는 경우, 저장 시작 시간과 종료 시간을 가진 파일을 만듭니다. 검색 시간 ( /retrieve플래그)에서는 타이머가 시작된 후 시작 또는 중단이 수행되었는지 이벤트 로그를 확인합니다. 최대 절전 모드를 어떻게 처리했는지 잘 모르겠습니다. 코드 나 프로그램을 게시하지 않을 것입니다 : 버그가 있습니다. 그리고 프로그램을 작동 시키려면 홍보하고 싶지 않은 보안 설정으로 많은 혼란을 겪어야했습니다.
Bob

기본 개념은 shutdown.exe전화를 가로 채서 파일에 시간을 기록하는 것이 었습니다.
Bob

2
@Bob-돌아 왔을 때 프로그램에 대해 게시하려고 했습니까? exe / 소스 코드에 대한 링크?
Alex S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.