powershell -command का निकास कोड स्क्रिप्ट के निकास कोड के समान नहीं है




exit-code (3)

आप अपनी स्क्रिप्ट को अंतःक्रियात्मक तरीके से कैसे बुला रहे हैं?

मैंने यह कोशिश की है और ऐसा लगता है कि यह ठीक काम करता है, लेकिन मैं इसे डीओएस प्रॉम्प्ट से कॉल करता हूं, पावरशेल के भीतर नहीं

C:\Temp>type foo.ps1
exit 42


C:\Temp>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\foo.ps1

C:\Temp>echo %errorlevel%
42

c:\Temp>

मुझे PowerShell -Command "और scriptname" के साथ एक स्क्रिप्ट चलाने की आवश्यकता है, और मुझे वास्तव में यह पसंद आएगा यदि PowerShell से बाहर निकलने वाला निकास कोड स्क्रिप्ट स्वयं लौटा हुआ निकास कोड जैसा ही था। दुर्भाग्यवश, यदि स्क्रिप्ट 0 देता है, तो PowerShell 0 देता है, और 1 यदि स्क्रिप्ट नीचे दिखाए गए अनुसार कोई गैर-शून्य मान देता है:

PS C:\test> cat foo.ps1
exit 42
PS C:\test> ./foo.ps1
PS C:\test> echo $lastexitcode
42
PS C:\test> powershell -Command "exit 42"
PS C:\test> echo $lastexitcode
42
PS C:\test> powershell -Command "& ./foo.ps1"
PS C:\test> echo $lastexitcode
1
PS C:\test>

[पर्यावरण] का उपयोग करना :: निकास (42) लगभग काम करता है:

PS C:\test> cat .\baz.ps1
[Environment]::Exit(42)
PS C:\test> powershell -Command "& ./baz.ps1"
PS C:\test> echo $lastexitcode
42
PS C:\test>

सिवाय इसके कि जब स्क्रिप्ट interactively चलाया जाता है, यह पूरे खोल से बाहर निकलता है। कोई सुझाव?


यदि आप उस भाग को देखते हैं जिसे आप एक स्क्रिप्ट के रूप में भेज रहे हैं, तो आप देखेंगे कि यह कभी काम नहीं करेगा। 'Foo.ps1' स्क्रिप्ट चलाने वाली स्क्रिप्ट में बाहर निकलने के लिए कॉल नहीं है, इसलिए यह निकास कोड वापस नहीं करता है।

यदि आप एक निकास कोड वापस करते हैं तो यह वही करेगा जो आप चाहते हैं। इसे "to 'से भी बदलें, अन्यथा यदि आप PowerShell से इसे चलाते हैं तो दूसरे PowerShell को स्ट्रिंग भेजने से पहले $ lastexitcode को हल किया जाएगा।

PS C:\test> powershell -Command './foo.ps1; exit $LASTEXITCODE'
PS C:\test> echo $lastexitcode
42

पीएस: अगर आप सिर्फ एक स्क्रिप्ट चलाने के लिए चाहते हैं तो फ़ाइल पैरामीटर भी देखें। लेकिन यह भी पता है कि अगर आपके पास टर्मिनल त्रुटि है- कॉमांड करता है तो यह 1 वापस नहीं आता है। उस अंतिम विषय पर और अधिक के लिए here देखें।

PS C:\test> powershell -File './foo.ps1'
PS C:\test> echo $lastexitcode
42

कैवेट: यदि आपकी पावरशेल स्क्रिप्ट बाहर निकलने वाले 65535 से बाहर निकलती है, तो वे रोल करते हैं:

$exitCode = 65536
Exit $exitCode

यदि निम्नलिखित सीएमडी उपरोक्त इस पीएस 1 स्क्रिप्ट को कॉल करता है, तो आपको 0 % त्रुटि का% त्रुटि मिल जाएगा

Powershell.exe "& 'MyPowershellScript.ps1' "; exit $LASTEXITCODE
SET ERR=%ERRORLEVEL%

और 65537 का एक निकास आपको 1 का त्रुटि त्रुटि% 1 देगा।

इस बीच, यदि एक सीएमडी एक और कॉल करता है और बाल स्क्रिप्ट 65535 से अधिक त्रुटि वाले रिटर्न देता है, तो यह ठीक से गुजरता है।

Cmd /c exit 86666

उम्मीदवार के रूप में सीएमडी 86666 का% त्रुटि स्तर% वापस कर देगा।

इन सभी के लिए चेतावनी: अब यह किसी भी स्पष्ट कारण के लिए चालू और बंद हो रहा है।







exit-code