ฉันสามารถรับ && เพื่อทำงานใน Powershell ได้หรือไม่


186

&&เป็นเรื่องยากที่ฉาวโฉ่ในการค้นหาใน google แต่ที่ดีที่สุดที่ฉันได้พบคือบทความนี้-andซึ่งกล่าวถึงการใช้

น่าเสียดายที่มันไม่ได้ให้ข้อมูลเพิ่มเติมและฉันไม่สามารถหาสิ่งที่ฉันควรจะทำกับ-and(อีกครั้งสิ่งที่ยากฉาวโฉ่ในการค้นหา)

บริบทที่ฉันพยายามจะใช้คือ "execute cmd1 และหากประสบความสำเร็จให้รัน cmd2" โดยพื้นฐานแล้วสิ่งนี้:

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

นี่ควรเป็นตัวแทนง่ายๆเพียงไม่กี่คนที่รู้ว่าขอบคุณ!


แก้ไข: หากคุณต้องการรันคำสั่งหลายคำสั่งในบรรทัดเดียวและคุณไม่สนใจว่าคำสั่งแรกล้มเหลวหรือไม่คุณสามารถใช้;เพื่อวัตถุประสงค์ส่วนใหญ่ของฉันได้

ตัวอย่างเช่นkill -n myapp; ./myapp.exe.


PowerShell มี - และและ - หรือตัวดำเนินการเชิงตรรกะ ผู้ประกอบการไม่ทำงานอย่างที่คุณคาดหวังไว้ใช่หรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถโพสต์นิพจน์ได้ที่นี่
Mohit Chakraborty

ดูคำถามนี้ทำในสิ่งที่คุณต้องการ: stackoverflow.com/questions/1917271/…
joshperry

2
ใครก็ตามที่มีความสนใจในทุบตีสไตล์&&และ||กลายเป็นส่วนหนึ่งของ PowerShell: การลงคะแนนเสียงโปรดสำหรับคุณลักษณะที่นี่
mklement0

1
เกี่ยวกับความต้องการในการค้นหาเว็บที่มีสัญลักษณ์ที่มีตัวอักษร (และสำคัญ): SymbolHoundมีประโยชน์สำหรับสิ่งนี้ นี่คือตัวอย่างบางส่วนที่เกี่ยวข้องกับคำถาม: powershell && ; PowerShell และอื่น ถ้าคุณใช้DuckDuckGoคุณสามารถค้นหา SymbolHound !symผ่าน
nisavid

3
อัปเดตมิถุนายน 2019 : ทีม PowerShell กำลังใช้งาน&&และ||! ชั่งน้ำหนักที่GitHub PR
pilau

คำตอบ:


193

ใน CMD '&&' หมายถึง "ดำเนินการคำสั่ง 1 และหากสำเร็จให้ดำเนินการคำสั่ง 2" ฉันใช้มันเพื่อสิ่งที่ชอบ:

build && run_tests

ใน PowerShell สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือ:

(build) -and (run_tests)

มันมีตรรกะเดียวกัน แต่ข้อความเอาต์พุตจากคำสั่งจะหายไป บางทีมันอาจจะดีพอสำหรับคุณ

หากคุณทำสิ่งนี้ในสคริปต์คุณอาจจะดีกว่าที่จะแยกข้อความเช่นนี้:

build
if ($?) {
    run_tests
}

2019/11/27 : &&ผู้ให้บริการพร้อมใช้งานสำหรับPowerShell 7 Preview 5+ แล้ว :

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

2
RE: "ไร้สาระที่พวกเขาจะลบ" - ฉันไม่คิดว่า PowerShell เป็น "CMD ที่นำชิ้นส่วนที่โง่ออก" is.gd/k92B
Jay

90
ฉันไม่คิดว่า PowerShell เป็น "CMD ที่นำชิ้นส่วนที่โง่ออก" ฉันชอบคิดว่ามันเป็น "Bash โดยไม่มีบิตที่มีประโยชน์"
Pod

15
คุณยังสามารถทำได้build ; if ($?) { run_tests }บนบรรทัดคำสั่งด้วย
docwhat

19
วิธีที่รวดเร็วที่สุดในการหงุดหงิดเมื่อเรียนรู้ PowerShell คือการเริ่มต้นด้วยการคิดว่ามันเป็นเพียง CMD หรือทุบตีที่ขยายเพิ่ม มันมีรูปแบบที่แตกต่างกันโดยเฉพาะอย่างยิ่งเมื่อมันมาถึง input, output, piping และผลลัพธ์ เริ่มต้นด้วยบทแนะนำหรือภาพรวมที่ดีและอย่าพยายามอย่างหนักที่จะทำให้ไวยากรณ์จากเชลล์อื่นทำงานได้ คุณต้องทำตามเงื่อนไขของตัวเอง
Mark Meuer

3
การใช้ PowerShell ตามเงื่อนไขของตัวเองฉันจะรันคำสั่งได้อย่างไรและถ้าคำสั่งนั้นประสบความสำเร็จให้รันคำสั่งอื่นได้อย่างไร ฉันไม่คิดว่านั่นเป็นbashแนวคิดที่น่าสนใจใน PowerShell เป็นฟังก์ชั่นพื้นฐานของเชลล์ จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันเคยเห็นคือbuild ; if ($?) { run_tests }สิ่งที่ฉันจะใช้นับจากนี้ ฉันหวังว่าทีม PowerShell จะเพิ่ม&&การสนับสนุน!
เนท

28

&& และ || อยู่ในรายการสิ่งที่ต้องใช้ (ยังคงเป็น) แต่ไม่ปรากฏขึ้นเป็นสิ่งที่มีประโยชน์มากที่สุดถัดไปที่จะเพิ่ม เหตุผลก็คือเรามี - และและ - หรือ หากคุณคิดว่าเป็นสิ่งสำคัญโปรดยื่นข้อเสนอแนะในการเชื่อมต่อและเราจะพิจารณาให้เป็น V3


11
ฉันสมัครใช้งาน Connect และเสนอชื่อตัวเองให้กับ PowerShell แต่ฉันไม่สามารถหาวิธีการแนะนำได้ เว็บไซต์ Connect นั้นซับซ้อนและสับสนจริงๆ :-(
Orion Edwards

6
ฉันไม่พบคำขอที่มีอยู่ก่อนดังนั้นฉันจึงทำอย่างใดอย่างหนึ่ง: connect.microsoft.com/PowerShell/feedback/details/778798/…
Andy Arismendi

22
คุณรู้ว่าคำถามยังคงเป็นวิธีการเขียนที่เทียบเท่าและคำตอบของคุณจะมีประโยชน์มากขึ้นถ้าคุณเพิ่มตัวอย่างของการใช้ -AND
Kyeotic

5
มันสำคัญเพราะเป็นเครื่องมือควบคุมการไหลพื้นฐานที่ใช้กับระบบที่เก่ากว่าหน้าต่างเกือบตลอดกาล ดังนั้นจึงเป็นของขวัญได้อีกความแตกต่างระหว่าง linux และ windows
airtonix

6
ฉันหวังว่า Jeffrey Snover จะฟังดังนั้นนี่ควรจะเป็นเหตุผลเพียงพอที่จะใช้งานได้ในตอนนี้ มันยาวเกินไปและตอนนี้ PowerShell เริ่มป๊อปอัปในสถานที่เช่น VSCode ใช้มันเป็นเทอร์มินัลเริ่มต้นใน Windows นี่คือความเจ็บปวดทั้งหมดโดยไม่ต้อง && -andกินผลออกมาไม่เท่ากันเลย
Ciantic

13

ลองสิ่งนี้:

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

9
หมายเหตุ: หากคำสั่งแรกล้มเหลวคำสั่งที่สองจะยังคงทำงานอยู่
BrunoLM

4
ตัวแปรการตั้งค่า$ErrorActionPreferenceจะควบคุมว่าข้อผิดพลาดที่ไม่สิ้นสุดที่รายงานโดยcmdletsนั้นได้รับการปฏิบัติอย่างไร สาธารณูปโภคภายนอกเช่นcscและa.exeไม่เคยรายงานข้อผิดพลาดดังกล่าว (พวกเขาเพียง แต่สะท้อนให้เห็นถึงสถานะทางออกของพวกเขาใน$?(ธงความสำเร็จ) และ$LASTEXITCODE(รหัสเฉพาะทางออกรายงาน)) ดังนั้นจำนวนบรรทัดคำสั่งของคุณเพื่อที่ไม่มีเงื่อนไขการดำเนินการของทั้งสองคำสั่ง (เทียบเท่าcmd's csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mklement0

5

หากคำสั่งของคุณมีอยู่ใน cmd.exe (คล้าย ๆpython ./script.pyแต่ไม่ใช่คำสั่ง PowerShell เช่นii .(หมายถึงการเปิดไดเรกทอรีปัจจุบันโดย explorer)) คุณสามารถเรียกใช้ cmd.exe ภายใน PowerShell ได้ ไวยากรณ์เป็นดังนี้:

cmd /c "command1 && command2"

ที่นี่&&มีให้โดยไวยากรณ์ cmd อธิบายไว้ในคำถามนี้


4
ดีอัพเกรดเป็น cmd เพื่อเข้าถึงฟังก์ชั่นเพิ่มเติม
Bill K

4

ฉันลองลำดับของคำสั่งใน PowerShell นี้:

การทดสอบ Fisrt

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")ไม่เคยวิ่งโดยกลับเท็จในคำสั่งทั้งหมด


ของคุณถูกต้อง! สิ่งนี้ทำหน้าที่เป็นตัวดำเนินการ && แม้แต่ $ () ทางด้านขวาจะไม่ยอมให้ประเมินสิ่งนี้!
Falco Alexander

2

คำถามที่เก่ามาก แต่สำหรับผู้มาใหม่: อาจเป็นรุ่น PowerShell (คล้ายกัน แต่ไม่เท่ากัน ) ที่คำถามนั้นกำลังมองหาให้ใช้-andดังนี้:

(build_command) -and (run_tests_command)


1
นี้อาจจะ ok สำหรับกรณีการใช้งานของคุณ แต่มันก็ไม่ได้ทำตัวเหมือนในการที่จะละเว้นรหัสทางออกของ&& build_command
Simon Buchan

นี่ไม่ใช่การทำสิ่งที่ถูกต้องอย่างแน่นอน มันจะรันคำสั่งที่สองแม้ว่าคำสั่งแรกจะล้มเหลว
เนท

นี่มันผิดทั้งหมด ;เท่ากับ&ในหน่วยคำสั่งและ;ในทุบตี มันไม่เหมือน&&ใน cmd
24327

นอกจากนี้ยังปิดเสียง STDOUT และ STDERR สำหรับกระบวนการทั้งสอง
Dragas

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(ซึ่งเป็นวิธีที่คุณควรเรียกใช้ยูทิลิตีบรรทัดคำสั่ง - โดยตรง) วิธีการจะสั้นเนื่องจากผลลัพธ์ของเงื่อนไขนั้นขึ้นอยู่กับว่ายูทิลิตี้สร้างเอาต์พุต stdout ใด ๆ หรือไม่ซึ่งไม่รับประกันความสัมพันธ์กับมัน สำเร็จหรือไม่
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 }

ดังนั้นสำหรับตัวอย่างของ op มันจะเป็น:

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

0

verbose ที่เทียบเท่าคือการรวม$LASTEXITCODEและ-eq 0:

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

ฉันไม่แน่ใจว่าทำไมif ($?)ไม่ทำงานให้ฉัน แต่อันนี้ทำ


-1

เราสามารถลองใช้คำสั่งนี้แทนที่จะใช้วิธีการ &&

ลอง {ชื่อโฮสต์; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} catch {echo err} ในที่สุด {}


มีความจำเป็นไม่เป็นtry/ catchเพราะมันเป็นสิ่งจำเป็นสำหรับการยกเลิกข้อผิดพลาดซึ่งสาธารณูปโภคภายนอกเช่นhostname, ipconfigและfindstrไม่สามารถทริกเกอร์ การตรวจสอบ$LASTEXITCODEเป็นสิ่งจำเป็นเฉพาะในกรณีที่คุณต้องการทราบรหัสทางออกเฉพาะที่กำหนดโดยยูทิลิตีภายนอกความสำเร็จหรือความล้มเหลวที่เป็นนามธรรมจะสะท้อนออก$?มาเช่นเดียวกับ cmdlet ดั้งเดิม
mklement0

ฉันคิดว่า @Cyberiron กำลังอยู่ในเส้นทางที่ถูกต้อง ฉันคิดว่า&&ใน Unix นั้นเหมือนลอง / จับมันโดยที่คุณไม่จำเป็นต้องห่อคำสั่งที่ตามมาในบล็อกใหม่ (เช่น}) เมื่อคุณลัดวงจรคำสั่งในภายหลัง (ข้ามพวกเขา) ฉันคิดว่าAmpAmpฟังก์ชั่น / ตัวกรองที่if (!?) { throw "last command failed" }จะเปลี่ยนเมื่อจะเป็นประโยชน์มากสำหรับการเปลี่ยน&&ไปใช้ PowerShell การใช้งาน :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.