क्या मुझे Powershell में काम करने के लिए && मिल सकता है?


186

&&गूगल पर खोज करने के लिए कुख्यात है, लेकिन मैंने जो सबसे अच्छा पाया है वह यह लेख है जो उपयोग करने के लिए कहता है -and

दुर्भाग्य से यह कोई और जानकारी नहीं देता है, और मुझे पता नहीं चल सकता है कि मैं क्या करने जा रहा हूं -and(फिर से, एक कुख्यात कठिन चीज़ जिसे खोजना है)

संदर्भ मैं इसे उपयोग करने की कोशिश कर रहा हूं "cmd1 निष्पादित करें, और यदि सफल, cmd2 निष्पादित करें", मूल रूप से यह है:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

यह किसी को जो जानता है, धन्यवाद के लिए एक आसान कुछ प्रतिनिधि होना चाहिए!


संपादित करें: यदि आप एक ही पंक्ति में कई कमांड चलाना चाहते हैं और आप परवाह नहीं करते हैं कि पहले एक विफल रहता है या नहीं, तो आप उपयोग कर सकते हैं ;मेरे अधिकांश उद्देश्यों के लिए यह ठीक है

उदाहरण के लिए kill -n myapp; ./myapp.exe:।


पॉवरशेल में और -और तार्किक ऑपरेटर हैं। क्या ऑपरेटर आपके द्वारा उनसे अपेक्षित तरीके से काम नहीं कर रहे हैं? यदि हां, तो आप यहां अभिव्यक्ति पोस्ट कर सकते हैं।
मोहित चक्रवर्ती

इस प्रश्न को देखें, यह वही करता है जो आप चाहते हैं: stackoverflow.com/questions/1917271/…
joshperry

2
जो कोई भी बैश-शैली में रुचि रखता है &&और ||पावरशेल का हिस्सा बन रहा है: कृपया यहाँ सुविधा के लिए वोट करें
mklement0

1
शाब्दिक (और महत्वपूर्ण) प्रतीकों के साथ प्रश्नों के लिए वेब खोज करने की आवश्यकता के बारे में: इसके लिए SymbolHound उपयोगी है। यहां कुछ उदाहरण दिए गए हैं जो प्रश्न से संबंधित हैं: शक्तियां && ; शक्तियां -और । यदि आप DuckDuckGo का उपयोग करते हैं , तो आप SymbolHound द्वारा खोज सकते हैं !sym
निसावद

3
जून 2019 अपडेट : पावरशेल टीम लागू कर रही है &&और ||! गीथहब पीआर
पिलाऊ

जवाबों:


193

CMD में, '&&' का अर्थ है "कमांड 1 को निष्पादित करें, और यदि यह सफल होता है, तो कमांड 2 को निष्पादित करें"। मैंने इसे चीजों के लिए उपयोग किया है:

build && run_tests

PowerShell में, सबसे करीबी चीज़ जो आप कर सकते हैं:

(build) -and (run_tests)

इसमें एक ही तर्क है, लेकिन कमांड से आउटपुट टेक्स्ट खो गया है। हालांकि यह आपके लिए काफी अच्छा है, हालांकि।

यदि आप एक स्क्रिप्ट में ऐसा कर रहे हैं, तो आप शायद बयानों को अलग करने से बेहतर होंगे, जैसे:

build
if ($?) {
    run_tests
}

2019/11/27 : &&ऑपरेटर अब PowerShell 7 पूर्वावलोकन 5+ के लिए उपलब्ध है :

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
पुन: "हास्यास्पद है कि वे निकाल देंगे" - मैं PowerShell के बारे में सोचना पसंद नहीं करता "बेवकूफ भागों को हटा दिया गया" के साथ सीएमडी। is.gd/k92B
Jay Bazuzi

90
मैं PowerShell को "सीएमडी के साथ हटाए गए बेवकूफ भागों के रूप में" सोचना पसंद नहीं करता। मैं इसे "बिना किसी उपयोगी बिट्स के बैश" के रूप में सोचना पसंद करता हूं।
पॉड

15
आप build ; if ($?) { run_tests }कमांड लाइन पर भी कर सकते हैं।
डॉकवाट

19
पॉवरशेल सीखने के दौरान वास्तविक हताशा का सबसे तेज़ तरीका यह सोचकर शुरू करना है कि यह सिर्फ एक विस्तारित सीएमडी या बैश है। यह एक मौलिक रूप से अलग मॉडल है epecially जब यह इनपुट, आउटपुट, पाइपिंग, और परिणाम के लिए आता है। एक अच्छे ट्यूटोरियल या ओवरव्यू के साथ शुरुआत करें, और अन्य गोले के काम से वाक्य रचना करने के लिए बहुत कठिन प्रयास न करें। आपको इसे अपनी शर्तों पर लेना होगा।
मार्क मेउर

3
PowerShell को अपनी शर्तों पर लेते हुए, मैं एक कमांड कैसे चला सकता हूं और फिर, केवल अगर वह कमांड सफल होता है, तो दूसरी कमांड चलाएं? मुझे नहीं लगता कि यह bashPowerShell पर विचार थोप रहा है । यह मूल शेल कार्यक्षमता है। अब तक का सबसे अच्छा मैंने देखा है build ; if ($?) { run_tests }जो मैं अभी से उपयोग कर रहा हूँ। मुझे आशा है कि PowerShell टीम &&समर्थन जोड़ती है !
नैट

28

&& और || लागू करने के लिए चीजों की सूची में थे (अभी भी हैं) लेकिन जोड़ने के लिए अगली सबसे उपयोगी चीज के रूप में पॉप अप नहीं किया। कारण यह है कि हमारे पास -और -OR है। यदि आपको लगता है कि यह महत्वपूर्ण है, तो कृपया कनेक्ट पर सुझाव दर्ज करें और हम इसे V3 के लिए विचार करेंगे।


11
मैंने कनेक्ट पर साइन अप किया है, और खुद को शक्तियां के लिए नामांकित किया है, लेकिन मैं सुझाव देने का तरीका नहीं जान सकता। कनेक्ट वेबसाइट वास्तव में जटिल और भ्रामक है :-(
ओरियन एडवर्ड्स

6
मुझे पहले से मौजूद अनुरोध नहीं मिला इसलिए मैंने एक बनाया: connect.microsoft.com/PowerShell/feedback/details/778798/…
एंडी अरिस्मेंडी

22
तुम्हें पता है, सवाल अभी भी है कि कैसे एक समकक्ष लिखना है, और यदि आप उपयोग करने का एक उदाहरण जोड़ते हैं, तो आपका उत्तर बहुत अधिक उपयोगी होगा-AND
Kyeotic

5
यह महत्वपूर्ण है क्योंकि यह एक बुनियादी प्रवाह नियंत्रण उपकरण है जो लगभग अनंत काल तक खिड़कियों की तुलना में पुराने सिस्टम पर उपयोग किया जाता है। इस प्रकार YET ANOTHER को linux और windows के बीच अंतर को प्रस्तुत करता है।
airtonix

6
मुझे उम्मीद है कि जेफरी स्नोवर सुन रहा है, इस एसओ को इसे अब तक लागू करने के लिए पर्याप्त कारण होना चाहिए। यह बहुत लंबा हो गया है, और अब PowerShell स्थानों में पॉपअप करना शुरू कर देता है, जैसे कि VSCode विंडोज में डिफ़ॉल्ट टर्मिनल के रूप में उपयोग करता है। यह बिना && के बिना कुल दर्द -andहै, आउटपुट खाता है, बिल्कुल भी नहीं।
Ciantic

13

इसे इस्तेमाल करे:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
नोट: यदि पहला कमांड विफल रहता है तो दूसरा अभी भी चलने वाला है।
ब्रूनोएलएम

4
वरीयता चर $ErrorActionPreferenceकेवल यह नियंत्रित करता है कि cmdlets द्वारा बताई गई गैर-समाप्ति त्रुटियों का इलाज कैसे किया जाता है; बाहरी उपयोगिताओं जैसे कि cscऔर a.exeकभी भी इस तरह की त्रुटियों की रिपोर्ट नहीं की जाती है (वे केवल अपनी $?सफलता की स्थिति (सफलता ध्वज) और $LASTEXITCODE(विशिष्ट निकास कोड ) में अपनी स्थिति को दर्शाते हैं , इसलिए आपकी कमांड लाइन दोनों कमांड के बिना शर्त निष्पादन के लिए राशि ( 's के बराबर )cmdcsc /t:exe /out:a.exe SomeFile.cs & a.exe
mklement0

5

यदि आपका कमांड cmd.exe में उपलब्ध है (कुछ ऐसा है, python ./script.pyलेकिन PowerShell कमांड की तरह नहीं है ii .( जैसे कि एक्सप्लोरर द्वारा वर्तमान निर्देशिका को खोलने का मतलब है), तो आप PowerShell के भीतर cmd.exe चला सकते हैं। वाक्य विन्यास इस प्रकार है:

cmd /c "command1 && command2"

यहाँ, इस सवाल में&& वर्णित cmd सिंटैक्स द्वारा प्रदान किया गया है ।


4
अच्छा है, इसे अतिरिक्त कार्यक्षमता तक पहुँच के लिए cmd में अपग्रेड करें।
बिल के

4

मैंने PowerShell में कमांड के इस क्रम को आज़माया:

फिजर्ट टेस्ट

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)लौटे सच और (Get-Content $MyVar)भी वापस आ सच

दूसरा टेस्ट

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)झूठे लौटे और अब तक मुझे (Get-Content $MyVar)यह भी मानना ​​चाहिए कि झूठे भी लौटे

तीसरे परीक्षण ने साबित किया कि दूसरी स्थिति का विश्लेषण भी नहीं किया गया था।

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)झूठे लौटे और साबित कर दिया कि दूसरी शर्त (Get-Content "C:\MyTxt.txt")कभी नहीं चली, पूरे आदेश पर झूठी वापसी करके ।


तुम सही हो! यह && ऑपरेटर के रूप में व्यवहार करता है। दाईं ओर एक $ () भी इसका मूल्यांकन नहीं करने देगा!
फाल्को अलेक्जेंडर

2

बहुत पुराना प्रश्न, लेकिन नए लोगों के लिए: हो सकता है कि पॉवरशेल संस्करण (समान लेकिन समान नहीं ) जिसे प्रश्न की तलाश है, -andइस प्रकार उपयोग करना है:

(build_command) -and (run_tests_command)


1
यह आपके उपयोग के मामले के लिए ठीक हो सकता है, लेकिन यह ऐसा व्यवहार नहीं कर रहा है &&, जिसमें यह बाहर निकलने के कोड को अनदेखा करता है build_command
साइमन बुकान

यह निश्चित रूप से सही काम नहीं कर रहा है। यह दूसरा कमांड चलाएगा भले ही पहले वाला फेल हो गया हो।
नैट

यह पूरी तरह से गलत है। cmd और bash में ;बराबर है । यह निश्चित रूप से cmd जैसा नहीं है&;&&
phuclv

यह दोनों प्रक्रियाओं के लिए STDOUT और STDERR को भी म्यूट करता है।
ड्रैगस

0

यह संदर्भ पर निर्भर करता है, लेकिन यहां "-और" का उदाहरण दिया गया है:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

तो यह है कि सभी फ़ाइलों को एक निर्देशिका में 10kb से बड़ा है जिसका फ़ाइल नाम "f" से शुरू होता है।


1
यह मूल प्रश्न का उत्तर नहीं है, जो कई कमांड निष्पादित करने के बारे में है।
bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

यह "&&" की तुलना में थोड़ा लंबा है, लेकिन स्क्रिप्टिंग के बिना एक ही बात को पूरा करता है और याद रखना बहुत मुश्किल नहीं है। देर आए दुरुस्त आए। :)


2
Start-Processसामान्य रूप से कमांड-लाइन उपयोगिताओं को लागू करने के लिए उपयोग करने के लिए गलत उपकरण है। विशेष रूप से, जैसा कि यहां उपयोग किया गया है, एक नई कंसोल विंडो में अतुल्यकालिक रूप से Start-Processचलता है filename1.exeऔर कुछ भी नहीं देता है , जो बूलियन संदर्भ में इसका मूल्यांकन करता है $false। यहां तक ​​कि अगर आप चूक गए Start-Process(जो कि आपको कमांड-लाइन उपयोगिताओं को कैसे लागू करना चाहिए - सीधे), तो दृष्टिकोण कम हो जाएगा, क्योंकि सशर्त का परिणाम तब निर्भर करता है कि क्या उपयोगिता ने किसी भी स्टडआउट आउटपुट का उत्पादन किया है, जिसके साथ कोई गारंटीकृत संबंध नहीं है या नहीं सफल हुआ या नहीं।
mklement0

0

मुझे लगता है कि एक सरल अगर बयान यह पूरा कर सकता है। एक बार जब मैंने ऊपर की अंतिम स्थिति में mkelement0 की प्रतिक्रिया देखी, तो इसे $ में संग्रहीत किया गया है; मैंने निम्नलिखित बातों को एक साथ रखा:

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

तो ऑप के उदाहरण के लिए, यह होगा:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

एक वर्बोज़ समतुल्य संयोजन $LASTEXITCODEऔर है -eq 0:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

मुझे यकीन नहीं है कि if ($?)मेरे लिए काम क्यों नहीं किया, लेकिन इस एक ने किया।


-1

हम इस कमांड का उपयोग करके && विधि के बजाय प्रयास कर सकते हैं

कोशिश {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} कैच {ईको इरेट} अंत में {}


इसके लिए कोई आवश्यकता नहीं है try/catch , क्योंकि यह केवल त्रुटियों को समाप्त करने के लिए आवश्यक है , जो बाहरी उपयोगिताओं जैसे कि hostname, ipconfigऔर findstrट्रिगर नहीं कर सकते हैं। जाँच $LASTEXITCODEकेवल तभी आवश्यक है जब आप बाहरी उपयोगिता द्वारा निर्धारित विशिष्ट निकास कोड जानना चाहते हैं - मूल सफलता या विफलता परिलक्षित होती है $?, ठीक उसी तरह जैसे कि देशी cmdlets के साथ होती है।
mklement0

मुझे लगता है कि @Cyberiron सही रास्ते पर है। मुझे लगता &&है कि यूनिक्स में एक बहुत कुछ है जैसे कि कोशिश / पकड़, इसमें आपको बाद के आदेशों को एक नए ब्लॉक (यानी }) में लपेटने की आवश्यकता नहीं होती है जब आप बाद में शॉर्ट-सर्किट करते हैं (उन्हें छोड़ें)। मुझे लगता है कि ऐसा AmpAmpफ़ंक्शन / फ़िल्टर जो फेंकता है जब PowerShell में if (!?) { throw "last command failed" }पोर्टिंग के &&लिए एक बहुत ही उपयोगी प्रतिस्थापन होगा । उपयोग :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.