2012-05-21 27 views
5

मैं समूह नीति संपादक जो (भी Windows XP के) विंडोज 7 का हिस्सा है का उपयोग एक तथाकथित बंद स्क्रिप्ट है, जो हर बार प्रणाली बंद या रिबूट है निष्पादित किया जाएगा चलाने के लिए। मेरी समस्या यह है: यदि उपयोगकर्ता ने सिस्टम को बंद करने के लिए चुना है, या यदि उसने इसके बजाय रीबूट चुना है तो मुझे अपनी स्क्रिप्ट में जानना होगा। दोनों क्रियाएं विंडोज को शट डाउन स्क्रिप्ट चलाएंगी, लेकिन मैं उस स्क्रिप्ट निष्पादन के दौरान कैसे निर्धारित कर सकता हूं कि वास्तव में कौन सी कार्रवाई की गई थी?विंडोज 7 स्क्रिप्ट में, मैं कैसे निर्धारित कर सकता हूं कि वर्तमान सिस्टम शट डाउन वास्तव में रीबूट है या नहीं?

क्या शट डाउन के दौरान, अगर सिस्टम वर्तमान में शटडाउन या रीबूट करता है, तो पता करने का कोई तरीका है?

उत्तर

8

पूर्व विस्टा सिस्टम आप रजिस्ट्री क्वेरी कर सकता है पर:

Shutdown Setting DWORD HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer भंडार की स्थापना वर्तमान उपयोगकर्ता के लिए शट डाउन विंडोज संवाद बॉक्स पर सूची से सबसे हाल ही में चयनित नीचे पाया।

अधिक हाल ही में सिस्टम पर, आप अपने बंद लिपि में सिस्टम Eventlog क्वेरी कर सकता है, इस तरह:

$systemstateentry = get-eventlog -LogName system -Source User32 | ?{$_.eventid -eq 1074} | select -first 1 

switch -regex ($systemstateentry.message) 
    { 
     ".*restart.*" {"restart"} 
     ".*power off.*" {"power off"} 
     default {"unknown"} 
    } 
+0

धन्यवाद एक बहुत, इस भी होगा जब बंद या रिबूट cmd- से प्रोग्राम के लिए किया गया था, या कमांडलाइन के माध्यम से, जैसा कि आप चलाने "shutdown.exe -r" या "shutdown.exe -s" खिड़की? मैं वास्तव में शटडाउन या रीबूट को पहचानना चाहता हूं, इससे कोई फर्क नहीं पड़ता कि इसे कैसे शुरू किया गया था। – Erik

+0

मेरे पिछले उत्तर में जोड़ें: दुर्भाग्यवश, यह मान मेरे किसी भी विंडोज 7 सिस्टम पर मौजूद नहीं है, और यह शट डाउन के दौरान भी मौजूद नहीं है, मैंने शट डाउन/रीबूट के दौरान उस मान के लिए एक छोटी वीबी स्क्रिप्ट जांच लिखी, लेकिन रजिस्ट्री मूल्य बस मौजूद नहीं है। क्या आप कृपया जांच सकते हैं कि यह मान आपके Win7 मशीन पर मौजूद है या नहीं? क्या यह जानकारी अभी भी Win7 के लिए सच है? – Erik

+0

विंडोज विस्टा/7 के लिए उत्तर अपडेट किया गया –

1

यह बैश कोड यदि सिस्टम रिबूट है निर्धारित करने के लिए wevtutil.exe उपयोगिता का उपयोग करता है। बैच स्क्रिप्ट में माइग्रेशन मुश्किल नहीं होना चाहिए। गैर-अंग्रेज़ी विंडोज़ के लिए, इवेंट लॉग में पंजीकृत समकक्ष शब्द के साथ restart को प्रतिस्थापित करें। This blog post अधिक जानकारी के साथ इस मुद्दे को शामिल करता है।

query='*[System[(EventID=1074) and TimeCreated[timediff(@SystemTime) <= 60000]]]' 
current_shutdown=$(wevtutil qe system -c:1 -rd:true -f:xml -q:"$query") 
rebooting=$(grep -iE "<data[^<>]*>restart</data>" <<<"$current_shutdown") 

if [[ -n "$rebooting" ]]; then echo 'System is rebooting' 
elif [[ -n "$current_shutdown" ]]; then echo 'System is shutting down' 
else echo 'System is neither rebooting nor shutting down'; fi