पावरशेल के माध्यम से इंटरनेट एक्सप्लोरर के साथ कुछ करने के बारे में हाल ही में पूछे जाने वाले प्रश्नों का एक सेट था। उनमें से सभी को PowerShell से IE को लॉन्च करने के लिए कोड हैं, $ie=new-object -comobject InternetExplorer.Application
के माध्यम से। समस्या यह है कि का उचित तरीका बंद करना है जिसमें $ie.quit()
कॉलिंग शामिल है, पहले काम नहीं करता है - पहला, यदि वह आईई एक खुले टैब से अधिक होता, तो IE पूरी तरह से छोड़ नहीं जाता है और केवल टैब जो कि COM ऑब्जेक्ट से मेल खाता है, और दूसरा, इसमें केवल एक टैब होना चाहिए, खिड़की बंद हो जाती है लेकिन प्रक्रियाएं बनी रहती हैं।PowerShell से लॉन्च होने पर इंटरनेट एक्सप्लोरर को सही तरीके से कैसे बंद करें?
PS > get-process iexplore
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
352 31 7724 24968 142 0,58 3236 iexplore
228 24 22800 15384 156 0,19 3432 iexplore
मैं कैसे बंद करने के लिए एक प्रक्रिया के माध्यम से New-Object -ComObject
शुरू कर दिया पर तरीकों अनुसंधान करने के लिए कोशिश की है, और यह पाया है: How to get rid of a COMObject। उस COMObject का उदाहरण Excel.Application
है, जो वास्तव में इरादे से व्यवहार करता है - quit()
कॉलिंग विंडो को बंद करता है, और [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
निष्पादित करता है यदि $ex
एक निर्मित COMObject एक्सेल प्रक्रिया को रोकता है। लेकिन इंटरनेट एक्सप्लोरर के साथ यह मामला नहीं है।
मैं भी इस सवाल का पाया है: How to get existing COM Object of a running IE जो खुले खिड़कियों की सूची के माध्यम से आईई से कनेक्ट करने के कोड प्रदान करता है, और दूसरी जगहों से प्रक्षेपित IE के एक हद तक काम करता है, लेकिन अगर COM वस्तु PowerShell के माध्यम से बनाई गई है, यह स्क्रिप्ट नहीं है पूरी तरह से आईई की प्रक्रियाओं को रोकने के लिए, अगर इस तरह के रूप में संशोधित सक्षम:
$shellapp = New-Object -ComObject "Shell.Application"
$ShellWindows = $shellapp.Windows()
for ($i = 0; $i -lt $ShellWindows.Count; $i++)
{
if ($ShellWindows.Item($i).FullName -like "*iexplore.exe")
{
$ie = $ShellWindows.Item($i)
$ie.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)
}
}
IE के मामले में PowerShell के बाहर शुरू किया, प्रक्रियाओं बंद कर दिया जाता है, लेकिन IE के मामले में PowerShell के भीतर शुरू की, दो प्रक्रियाओं रहते हैं, और इस कोड को रिपोर्ट COM ऑब्जेक्ट तक पहुंचने के लिए कोई आईई विंडो नहीं मिली है, इसलिए आईई प्रक्रियाएं (अभी तक) रुकने में असमर्थ हैं।
तो, स्पष्ट रूप से अनाथ खिड़की रहित आईई प्रक्रियाओं तक पहुंचने के लिए कैसे और शानदार उन्हें रोकें? मुझे Get-Process iexplore | Stop-Process
के बारे में पता है, लेकिन यह किसी भी और सभी आईई को रोक देगा, न केवल स्क्रिप्ट द्वारा लॉन्च किए गए, और अगर स्क्रिप्ट प्रशासक या SYSTEM
पर चलाया जाता है, तो दूरस्थ डेस्कटॉप सर्वर कहें, हर किसी के आईई बंद हो जाएंगे।
पर्यावरण: ओएस विंडोज 7 एक्स 64, पावरशेल 4 (पीएस संस्करण 2 के ऊपर स्थापित), आईई 11 संस्करण 11.0.9600.176 9 1 (स्वचालित रूप से अपडेट किया गया)। आईई शुरू करने पर "होम पेज खोलें" पर सेट है, इसलिए कम से कम एक टैब हमेशा खुला रहता है।
वैसे, मैंने अभी कोशिश की है, और मैंने एक दिलचस्प बात देखी है। जब मैं बनाया गया आईई COMObject के खिलाफ '[Runtime.Interopservices.Marshal] :: रिलीजकॉम ऑब्जेक्ट() 'को कॉल करता है तो यह एक गैर-शून्य मान देता है - यह स्पष्ट रूप से इंगित करता है कि सिस्टम में उस COM ऑब्जेक्ट के अधिक लिंक हैं। इसके अलावा मेरे मामले में तीन प्रक्रियाएं शुरू की गई हैं, दो नहीं। यह आईई संस्करण और ओएस संस्करण से भिन्न हो सकता है, इसलिए मैं अन्य पीसी पर फिर से जांच करूंगा। अब तक यह आईई 11 में पेश की गई बग या .NET 4.5 में एक बग जैसा दिखता है, यदि यह समस्या Win8.1 और IE11 (जो अभी उपलब्ध नहीं है) के साथ एक पीसी पर प्रकट होगी। – Vesper
हम्म, ऐसा इसलिए हो सकता है क्योंकि ओएस x64 है, दो शेष प्रक्रियाएं एक x64 और एक x32 हैं, और केवल एक x32 एक परिणाम को x64 एक के शानदार स्टॉप में मारना। तो, यह वास्तव में आईई में स्पष्ट रूप से एक (अभी तक एक और) बग हो सकता है :) – Vesper
@ वेस्पर मुझे शक होगा। मेरे उत्तर में प्रदर्शन 64-बिट विंडोज 8.1 से भी है (इंटरनेट एक्सप्लोरर 11 के साथ)। –