निर्धारित शटडाउन से पहले बचा समय?


8

क्या यह देखने का कोई तरीका है कि विंडोज 7 में एक अनुसूचित शटडाउन से पहले कितना समय बचा है?

अनुसूचित शटडाउन से मेरा मतलब है कि एक शटडाउन (या पुनरारंभ) कमांड लाइन shutdown.exeएप्लिकेशन का उपयोग करके अनुसूचित है , उदाहरण के लिए:

shutdown /t 600 /s

यह कहते हुए एक संदेश बॉक्स पॉप होगा कि शटडाउन तक 10 मिनट हैं, और शटडाउन का वास्तविक सिस्टम समय है।

600इसके बजाय सेकंड से अधिक समय एक गुब्बारे संदेश का उपयोग करता है।

मैं अस्पष्ट रूप से एक उलटी गिनती के साथ GUI प्रगति मॉनिटर प्रदान करने वाले XP को याद करता हूं।

उन्होंने कैसे काम किया? शटडाउन का समय या निर्धारित समय कहीं संग्रहीत किया जाना चाहिए, मैं इसे कैसे एक्सेस कर सकता हूं?

मेरी पसंद कमांड लाइन (यानी गैर-जीयूआई) के माध्यम से कुछ विधि है। इससे भी महत्वपूर्ण बात यह है कि क्या यह विंडोज़ के भीतर, बिना किसी तीसरे पक्ष के कार्यक्रम के पूरा हो सकता है?

यदि यह मानक विंडोज उपयोगिताओं (और मैं यहां स्टैक ओवरफ्लो क्षेत्र पर सीमा कर रहा हूं) के साथ पूरा करने योग्य नहीं है, तो क्या कोई विंडोज एपीआई (या .NET है, जिसे पावरशेल में भी इस्तेमाल किया जा सकता है!) फ़ंक्शन। या तो कुछ यादृच्छिक तीसरे पक्ष के कार्यक्रम पर प्राथमिकता दी जाएगी।


superuser.com/a/317062/117590 आशाजनक दिख रहा है, हालांकि, यह पसंद / आवश्यक है कि शटडाउन कमांड को एक टिप्पणी जोड़ने के रूप में संशोधित नहीं किया गया है ( /c <time>) करता है।
बॉब

मुझे लगता है कि एक बैच फ़ाइल को लिखना मुश्किल नहीं होगा .. समय के लिए प्रेरित करें, और हर 5 मिनट या तो यह एक समय के साथ जवाब दे सकता है, IE "10 मिनट शेष" .. और जब यह 1 पर पहुंच जाता है, तो नीचे से गिनें सेकंड या कुछ और।
कटिक्रमज

मुझे एक उलटी गिनती की आवश्यकता नहीं है, मुझे इस <क्षण> शेष समय प्राप्त करने के लिए कुछ विधि की आवश्यकता है। शटडाउन कमांड को बाहरी प्रोग्राम द्वारा बुलाया जा रहा है।
बॉब

जवाबों:


5

प्रश्न दिलचस्प था इसलिए मैंने बैच लिखा जो आपके लिए काम कर सकता है।

मूल रूप से यह काउंटडाउन टाइमर है, मैंने इसे shutdownकमांड शामिल नहीं किया, लेकिन इसे होमवर्क के रूप में शामिल किया। गणना सटीक नहीं है, यह लीप वर्ष, महीने की लंबाई के बारे में परवाह नहीं करता है ... यह मुख्य रूप से पठनीयता के लिए है क्योंकि मैं इसे सीखना आसान रखना चाहता था।

वर्तमान में दो फाइलें एक साथ काम कर रही हैं, एक टाइमर शुरू करता है और अन्य, जब कहा जाता है, बताता है कि टाइमर शुरू होने से कितना समय बीत गया। इन दो फ़ाइलों को काफी आसानी से एक सीएमडी स्क्रिप्ट में जोड़ा जा सकता है, इस तरह आप कुछ लाइनों को पुन: प्रयोज्य ( जैसे परिभाषित तरीके ) भी बना सकते हैं।

ठीक है, आइए स्क्रिप्टों पर एक नज़र डालें,

यहाँ है 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अर्थ का उपयोग करके मान पढ़ें । 4. स्टोर चर के मूल्यों , ... , , ...%%a-%%fSpaceorTAB
%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मौजूद है, यदि नहीं तो बुद्धि संदेश को समाप्त कर दें। यदि टाइमर शुरू हुआ और फाइलें मौजूद हैं तो हम जारी रखते हैं और कुछ गणित करते हैं:
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स्पष्ट रूप से बुलाया जाना चाहिए। मैंने अपनी समस्या को हल करने के लिए एक छोटा सा कार्यक्रम लिखा था, जिसे मैं अपने कंप्यूटर पर वापस आने पर पोस्ट करूँगा।
बॉब

ठीक है, मैं इसे स्वीकार करूंगा। मैंने एक C # प्रोग्राम लिखा था जिसे नाम दिया गया था shutdown.exe, जिसे कॉल किया गया shutdown_original.exe। यह /tझंडे के लिए जाँच करेगा और यदि यह अस्तित्व में है, तो शुरू और समाप्ति समय के साथ एक फ़ाइल बनाएं। समय ( /retrieveध्वज) को पुनः प्राप्त करने पर , यह देखने के लिए इवेंट लॉग की जांच करेगा कि टाइमर शुरू होने के बाद से स्टार्टअप या गर्भपात किया गया था या नहीं। मुझे यकीन नहीं है कि यह हाइबरनेशन कैसे संभाला होगा। मैं कोड या प्रोग्राम पोस्ट नहीं करने जा रहा हूं: यह एक छोटी सी गड़बड़ है। और कार्यक्रम को काम करने के लिए, मुझे सुरक्षा सेटिंग्स के साथ बहुत गड़बड़ करना पड़ा, जिसे मैं बढ़ावा नहीं देना चाहता।
बॉब

मूल अवधारणा shutdown.exeकॉल को इंटरसेप्ट कर रही थी और बार को एक फ़ाइल में लॉग कर रही थी, जो आपने किया था और मैं इसे क्यों स्वीकार कर रहा हूं।
बॉब

2
@ याकूब - जब आप वापस आए तो आप अपने कार्यक्रम के बारे में पोस्ट करने जा रहे थे? Exe / स्रोत कोड के लिंक?
एलेक्स एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.