2009-12-16 12 views
7

मुझे आश्चर्य है कि किसी को पिछले कार्यक्रम की निकास सफलता/विफलता के आधार पर किसी प्रोग्राम को सशर्त रूप से निष्पादित करने के तरीके के बारे में पता है। प्रोग्राम 1 के तुरंत बाद प्रोग्राम 2 निष्पादित करने का कोई तरीका है यदि प्रोग्राम 1 LASTEXITCODE चर के परीक्षण किए बिना सफलतापूर्वक बाहर निकलता है? मैंने बैंड और एंड ऑपरेटरों को कोई फायदा नहीं हुआ, हालांकि मुझे एहसास हुआ कि वे वैसे भी काम नहीं करेंगे, और सबसे अच्छा विकल्प अर्धविराम और एक कथन का संयोजन है। मेरा मतलब है, जब यह & & ऑपरेटर पीटा नहीं किया जा सकता, लिनक्स पर स्रोत से कुछ हद तक स्वचालित रूप से एक पैकेज के निर्माण की बात आती है:विंडोज पावरशेल में सशर्त रूप से प्रक्रिया निष्पादित करें (उदाहरण के लिए && और || बैश में ऑपरेटरों)

# Configure a package, compile it and install it 
./configure && make && sudo make install 

PowerShell, निम्नलिखित करने के लिए यह सोचते हैं मैं वास्तव में एक ही इस्तेमाल कर सकते हैं मुझे आवश्यकता होगी PowerShell में प्रणाली का निर्माण:

# Configure a package, compile it and install it 
.\configure ; if ($LASTEXITCODE -eq 0) { make ; if ($LASTEXITCODE -eq 0) { sudo make install } } 

ज़रूर, मैं, कई पंक्तियों इस्तेमाल कर सकते हैं एक फ़ाइल में सहेजने और स्क्रिप्ट को निष्पादित, लेकिन यह विचार है यह संक्षिप्त होना करने के लिए (कीस्ट्रोक्स बचाने के लिए)। शायद यह PowerShell और Bash (और यहां तक ​​कि अंतर्निहित विंडोज कमांड प्रॉम्प्ट के बीच एक अंतर है जो & & ऑपरेटर का समर्थन करता है) मुझे समायोजित करने की आवश्यकता होगी, लेकिन अगर ऐसा करने के लिए क्लीनर तरीका है, तो मुझे जानना अच्छा लगेगा ।

+0

जो कोई भी बैश-शैली '&&' और '||' में पावरशेल का हिस्सा बनने में रूचि रखता है: कृपया सुविधा के लिए वोट दें [यहां] (https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11087898 लागू-और ऑपरेटरों-कि-बैश-है)। – mklement0

उत्तर

2

आप ऐसा करने के लिए एक फ़ंक्शन बना सकते हैं, लेकिन ऐसा करने का कोई सीधा तरीका नहीं है जिसे मैं जानता हूं।

function run-conditionally($commands) { 
    $ranAll = $false 
    foreach($command in $commands) { 
     invoke-command $command 
     if ($LASTEXITCODE -ne 0) { 
      $ranAll = $false 
      break; 
     } 
     $ranAll = $true 
    } 

    Write-Host "Finished: $ranAll" 

    return $ranAll 
} 

तो यह

run-conditionally(@(".\configure","make","sudo make install")) 

के समान फोन शायद वहाँ कुछ त्रुटियों यह एक powershell वातावरण काम के बिना कफ बंद है कर रहे हैं।

+0

मैं इसे काम करने के लिए ट्विक कर दूंगा (Invoke-Expression की आवश्यकता है क्योंकि Invoke-Command स्पष्ट रूप से जिस तरीके से इसे करना चाहिए ... या कुछ नहीं), लेकिन यह निश्चित रूप से कुछ उपयोगी है। सहायता के लिए धन्यवाद। यह बहुत सराहना की है। – Dustin

+3

'$ LASTEXITCODE' का उपयोग करने में समस्या यह है कि यह केवल तब सेट होता है जब PowerShell एक कंसोल EXE निष्पादित करता है। आप '$?' का उपयोग कर बेहतर हो सकते हैं। –

+0

फिर आप उस कार्य को उपनाम कर सकते हैं ताकि इसे आमंत्रित करना आसान हो सके। – GrayWizardx

0

मैं वास्तव में, बहुत & & की कमी के लिए नुक्सान पहुंचाने का है, तो GrayWizardX के उत्तर के आधार पर निम्नलिखित सरल स्क्रिप्ट (जो के रूप-है काम नहीं करता है) ने लिखा:

foreach($command in $args) 
{ 
    $error.clear() 
    invoke-command $command 
    if ($error) { break; } 
} 

आप इसे के रूप में सहेजते हैं

rc {.\configure} {make} {make install} 

तार के बजाय तर्क के रूप में स्क्रिप्ट ब्लॉक (घुंघराले ब्रेसिज़) का उपयोग करना मतलब है कि आप टैब पूरा होने के समय उपयोग कर सकते हैं: rc.ps1 अपने रास्ते में एक निर्देशिका में ("रन सशर्त" के लिए), आप इसे पसंद उपयोग कर सकते हैं आदेशों को टाइप करना, जो म्यूक है एच nicer। यह स्क्रिप्ट लगभग & & जितनी अच्छी है, और काम करता है।

+1

इसके अलावा, चौथी रेखा को 'if ($?) {Break; } 'स्क्रिप्ट को इस तरह व्यवहार करता है ||, अगर यह स्पष्ट नहीं था। – Abram

+0

_clear_ '$ त्रुटि' संग्रह को देखना अच्छा नहीं है; $ परीक्षण '?' क्या करेंगे ('अगर ($?) {} को तोड़ने' '' && के लिए, और 'अगर (-not $?) {} को तोड़ने' '' || के लिए)। 'उपयोग करने के लिए आह्वान-Command', आप एक _script block_ गुजरना होगा तो यह' $ args' पैरामीटर कि जिस तरह से टाइप करने के लिए बेहतर है: '[scriptblock []] $ args'। इसके अलावा, दुष्प्रभावों को रोकने के लिए, 'Invoke-Command -NoNewScope' का उपयोग करें - या बस'। 'ऑपरेटर का उपयोग करें। – mklement0

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