2012-04-16 9 views
9

क्या यह संभव है? आखिरकार मैंने अपने निजी .NET विकास पर्यावरण को स्थापित करने का फैसला किया है कि मैं एक * NIX dev पर्यावरण कैसे स्थापित करूं, जिसका मतलब है कि पावरहेल को ईमानदारी से सीखना।मैं PowerShell में सिग्नल कैसे फंस सकता हूं?

मैं वर्तमान में एक फ़ंक्शन लिख रहा हूं जो फ़ाइल सिस्टम के माध्यम से रिकर्स करता है, कार्यशील निर्देशिका को सेट करने के लिए काम करता है। मुझे परेशान करने वाली एक छोटी सी चीज यह है कि यदि मैं फंक्शन से Ctrl + C से बाहर हूं, तो यह मुझे छोड़ देता है जहां स्क्रिप्ट आखिरी थी। मैंने trap ब्लॉक सेट करने का प्रयास किया है जो डीआईआर को शुरुआती बिंदु पर चलाते समय बदलता है, लेकिन ऐसा लगता है कि अपवाद पर केवल (और आग) का इरादा है।

यदि यह ऐसी भाषा में था जो यूनिक्स में रूट था, तो मैं SIGINT के लिए सिग्नल हैंडलर स्थापित करता था, लेकिन मुझे पावरहेल में कुछ भी खोज नहीं मिल रहा है। मेरी .NET टोपी पर रखकर, मैं कल्पना कर रहा हूं कि कुछ प्रकार की घटना है कि मैं एक हैंडलर संलग्न कर सकता हूं, और अगर मुझे लगता है कि यह $host का एक कार्यक्रम होगा, लेकिन मुझे कोई कैननिकल दस्तावेज नहीं मिल रहा है System.Management.Automation.Internal.Host.InternalHostUserInterface, और कुछ भी नहीं जो मैं खोज करने में सक्षम हूं, सहायक रहा है।

शायद मुझे कुछ पूरी तरह से याद आ रही है?

उत्तर

16

क्या आपका ऐसा कुछ मतलब है?

try 
{ 
    Push-Location 
    Set-Location "blah" 
    # Do some stuff here 
} 

finally 
{ 
    Pop-Location 
} 

देखें प्रलेखन here. विशेष रूप से है कि पैरा:। "अंत में बयान कोशिश ब्लॉक एक समाप्त त्रुटि का सामना करना पड़ता है कि क्या की परवाह किए बिना चलाने ब्लॉक विंडोज PowerShell चलाता से पहले स्क्रिप्ट समाप्त कर देता है अंत में ब्लॉक या पहले वर्तमान ब्लॉक से बाहर चला जाता है स्कोप। अंत में ब्लॉक को तब भी चलाया जाता है जब आप स्क्रिप्ट को रोकने के लिए CTRL + C का उपयोग करते हैं। अंत में ब्लॉक भी चलाता है यदि कोई एक्जिट कीवर्ड स्क्रिप्ट ब्लॉक के भीतर से स्क्रिप्ट को रोकता है। "

+2

अंत में एक CTRL-C को साफ करने के लिए एक सीधी-सपाट समाधान नौकरी (समाप्त: – Callahan

5

यह कंसोल केपबोर्ड इनपुट को संभालता है। यदि लूप के दौरान नियंत्रण सी दबाया जाता है तो आपको ईवेंट को संभालने का मौका मिलेगा, हालांकि आप चाहते हैं। उदाहरण कोड में एक चेतावनी मुद्रित होती है और लूप निकल जाता है।

[console]::TreatControlCAsInput = $true 
dir -Recurse -Path C:\ | % { 
    # Process file system object here... 
    Write-Host $_.FullName 

    # Check if ctrl+C was pressed and quit if so. 
    if ([console]::KeyAvailable) { 
     $key = [system.console]::readkey($true) 
     if (($key.modifiers -band [consolemodifiers]"control") -and ($key.key -eq "C")) { 
      Write-Warning "Quitting, user pressed control C..." 
      break 
     } 
    } 
+0

आईएसई से काम नहीं करता है, लेकिन एक सामान्य PowerShell विंडो में सही – Froosh

संबंधित मुद्दे

 संबंधित मुद्दे