powershell पावरहेल के इनवोक-कमांड के साथ बुलाए गए स्क्रिप्टब्लॉक के रिटर्न वैल्यू को कैसे कैप्चर करें




return-value exit-code (4)

मेरा प्रश्न इस तरह के समान है, सिवाय इसके कि मैं Invoke-Command का उपयोग करके स्क्रिप्टब्लॉक के रिटर्न कोड को कैप्चर करने का प्रयास कर रहा हूं (इसलिए मैं -फाइलपाथ विकल्प का उपयोग नहीं कर सकता)। मेरा कोड यहाँ है:

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

समस्या यह है कि Invoke-Command script.cmd के रिटर्न कोड को कैप्चर नहीं करता है, इसलिए मुझे यह जानने का कोई तरीका नहीं है कि यह विफल रहा है या नहीं। मुझे यह जानने में सक्षम होना चाहिए कि script.cmd विफल रहा है या नहीं।

मैंने एक नया-पस्सेशन का उपयोग करने की भी कोशिश की (जो मुझे रिमोट सर्वर पर script.cmd का रिटर्न कोड देखने देता है) लेकिन मुझे विफलता के बारे में कुछ भी करने के लिए इसे मेरे कॉलिंग पावरशेल स्क्रिप्ट पर वापस पास करने का कोई तरीका नहीं मिल रहा है।


$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
  1. नए-पंसेशन का उपयोग करके एक नया सत्र बनाएं
  2. इस सत्र में अपने स्क्रिप्टब्लॉक को आमंत्रित करें
  3. इस सत्र से lastexitcode लाओ

@ जोन जेड का जवाब अच्छा है, लेकिन यह आसान है:

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}

बेशक यदि आपका आदेश आउटपुट उत्पन्न करता है तो आपको इसे दबाना होगा या निकास कोड प्राप्त करने के लिए इसे पार्स करना होगा, जिस स्थिति में @ जेन जेड का उत्तर बेहतर हो सकता है।


$script = {
    # Call exe and combine all output streams so nothing is missed
    $output = ping badhostname *>&1

    # Save lastexitcode right after call to exe completes
    $exitCode = $LASTEXITCODE

    # Return the output and the exitcode using a hashtable
    New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}

# Capture the results from the remote computers
$results = Invoke-Command -ComputerName host1, host2 -ScriptBlock $script

$results | select Host, Output, ExitCode | Format-List

होस्ट: HOST1
आउटपुट: पिंग अनुरोध होस्ट बैडहोस्टनाम नहीं मिला। कृपा करके नाम जाँचिए और फिर से प्रयास कीजिए
ExitCode: 1

होस्ट: HOST2
आउटपुट: पिंग अनुरोध होस्ट बैडहोस्टनाम नहीं मिला। कृपा करके नाम जाँचिए और फिर से प्रयास कीजिए।
ExitCode: 1


मैं इस समस्या को हल करने के लिए हाल ही में एक और विधि का उपयोग कर रहा हूं। दूरस्थ कंप्यूटर पर चल रहे स्क्रिप्ट से आने वाले विभिन्न आउटपुट एक सरणी हैं।

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

$result परिवर्तक में पिंग आउटपुट संदेश और $lastexitcode एक सरणी होगी। यदि रिमोट स्क्रिप्ट से निकास कोड आखिरी आउटपुट है तो इसे बिना किसी विश्लेषण के पूर्ण परिणाम से लाया जा सकता है।

निकास कोड से पहले बाकी आउटपुट प्राप्त करने के लिए यह बस है:
$result | Select-Object -First $(result.Count-1)





invoke-command