ฉันจะรันคำสั่งสองคำสั่งในหนึ่งบรรทัดใน Windows CMD ได้อย่างไร


961

ฉันต้องการเรียกใช้สองคำสั่งในคอนโซล Windows CMD

ใน Linux ฉันจะทำเช่นนี้

touch thisfile ; ls -lstrh

มันทำบน Windows ได้อย่างไร?

คำตอบ:


1320

เช่นนี้ใน Microsoft OS ทุกรุ่นตั้งแต่ปี 2000 และยังคงดีในวันนี้:

dir & echo foo

หากคุณต้องการให้คำสั่งที่สองดำเนินการเฉพาะเมื่อการออกครั้งแรกสำเร็จแล้ว:

dir && echo foo

ไวยากรณ์ของเครื่องหมายแอมเปอร์แซนด์ (&) เดียวเพื่อดำเนินการคำสั่งหลายคำสั่งในหนึ่งบรรทัดกลับไปเป็น Windows XP, Windows 2000 และ NT เวอร์ชันก่อนหน้า (4.0 อย่างน้อยอ้างอิงจากผู้วิจารณ์คนหนึ่งที่นี่)

มีจุดอื่น ๆ อีกสองสามข้อเกี่ยวกับสิ่งนี้ที่คุณจะพบการเลื่อนหน้าลง

ข้อมูลประวัติต่อไปนี้สำหรับผู้ที่อาจพบว่าการศึกษา

ก่อนหน้านั้นไวยากรณ์ && เป็นเพียงคุณลักษณะของการแทนที่เชลล์ 4DOS ก่อนที่คุณสมบัตินั้นจะถูกเพิ่มไปยังล่ามคำสั่งของ Microsoft

ใน Windows 95, 98 และ ME คุณจะต้องใช้อักขระไพพ์แทน:

dir | echo foo

ใน MS-DOS 5.0 และใหม่กว่าผ่านตัวแปลคำสั่งรุ่น Windows และ NT รุ่นก่อนหน้าตัวคั่นคำสั่ง (ที่ไม่มีเอกสาร) คืออักขระ 20 (Ctrl + T) ซึ่งฉันจะแทนด้วย ^ T ที่นี่

dir ^T echo foo

26
อย่างน้อยลงไปที่ NT 4
Joey

17
ทำงานบน Win 8.0 และ 8.1 ได้เช่นกัน
MEMark

5
@ Fallenreaper ที่ใช้งานได้ทันทีcmdเช่นกันดังนั้นฉันคิดว่ามันไม่ได้เป็นนิสัยที่ไม่ดีเลย :)

6
@ Fallenreaper ตรวจสอบให้แน่ใจว่าคุณตระหนักถึงความแตกต่างระหว่างทั้งสอง: ดูคำตอบของ Raihan ด้านล่าง
Moshe Katz

8
เข้าใจแล้ว A & B, B จะทำงานถ้า A ประสบความสำเร็จในขณะที่ A & B จะทำงาน B หลังจาก A ไม่ว่าผลลัพธ์ของ A คืออะไร ขอบคุณสำหรับหัวขึ้น
Fallenreaper

579

คำพูดจากเอกสาร:

การใช้หลายคำสั่งและสัญลักษณ์การประมวลผลตามเงื่อนไข

คุณสามารถเรียกใช้หลายคำสั่งจากบรรทัดคำสั่งเดียวหรือสคริปต์โดยใช้สัญลักษณ์การประมวลผลตามเงื่อนไข เมื่อคุณรันหลายคำสั่งด้วยสัญลักษณ์การประมวลผลแบบมีเงื่อนไขคำสั่งทางด้านขวาของสัญลักษณ์การประมวลผลแบบมีเงื่อนไขจะขึ้นอยู่กับผลลัพธ์ของคำสั่งทางด้านซ้ายของสัญลักษณ์การประมวลผลแบบมีเงื่อนไข

ตัวอย่างเช่นคุณอาจต้องการเรียกใช้คำสั่งเฉพาะเมื่อคำสั่งก่อนหน้านี้ล้มเหลว หรือคุณอาจต้องการเรียกใช้คำสั่งเฉพาะเมื่อคำสั่งก่อนหน้านี้ประสบความสำเร็จ

คุณสามารถใช้อักขระพิเศษที่แสดงรายการในตารางต่อไปนี้เพื่อส่งผ่านหลายคำสั่ง

  • & [...]
    command1 & command2
    ใช้เพื่อแยกหลายคำสั่งในหนึ่งบรรทัดคำสั่ง Cmd.exe เรียกใช้คำสั่งแรกแล้วคำสั่งที่สอง

  • && [...]
    command1 && command2
    ใช้เพื่อเรียกใช้คำสั่งดังต่อไปนี้ && ถ้าคำสั่งที่อยู่ข้างหน้าสัญลักษณ์นั้นสำเร็จเท่านั้น Cmd.exe เรียกใช้คำสั่งแรกแล้วเรียกใช้คำสั่งที่สองเฉพาะเมื่อคำสั่งแรกเสร็จสมบูรณ์แล้ว

  • || [...]
    command1 || command2
    ใช้เพื่อเรียกใช้คำสั่งต่อไปนี้ || เฉพาะในกรณีที่คำสั่งก่อนหน้า | | ล้มเหลว Cmd.exe เรียกใช้คำสั่งแรกแล้วเรียกใช้คำสั่งที่สองก็ต่อเมื่อคำสั่งแรกดำเนินการไม่สำเร็จ (ได้รับรหัสข้อผิดพลาดมากกว่าศูนย์)

  • ( ) [...]
    (command1 & command2)
    ใช้เพื่อจัดกลุ่มหรือซ้อนหลายคำสั่ง

  • ; or ,
    command1 parameter1;parameter2
    ใช้เพื่อแยกพารามิเตอร์คำสั่ง


41
ลองcmd /c "echo foo & echo bar"ดู
Raihan

2
vagrant up && vagrant sshทำงานโดยไม่มีเครื่องหมายอัญประกาศใน Windows 10
furman87

ขอบคุณ! ฉันไม่รู้เกี่ยวกับไหม้&- ทำให้มันไม่ตรงกันและทำงานทั้งคู่ขนานกัน ฉันติดขัดเพราะฉันใช้&&กับมันเป็นแบบซิงโครนัสและจะดำเนินต่อไปถ้าประสบความสำเร็จครั้งแรก!
TetraDev

1
การเชื่อมโยงเอกสารเสียตำแหน่งใหม่technet.microsoft.com/en-us/library/bb490954.aspx
nkef

7
@TetraDev &ไม่ได้ทำคำสั่งแบบอะซิงโครนัสหรือขนาน command1 & command2จะทำงานcommand2 หลังจาก command1เสร็จสิ้น ความสำเร็จหรือความล้มเหลวของcommand1ไม่เกี่ยวข้อง
เกิดจาก

74

&เป็น Bash ที่เทียบเท่ากับ;(คำสั่ง run) และ&&เทียบเท่ากับ Bash &&(คำสั่ง run เฉพาะเมื่อก่อนหน้านี้ไม่ได้ทำให้เกิดข้อผิดพลาด)


1
สิ่งนี้เป็นจริงสำหรับ csh, tcsh และเชลล์อีกมากมาย ฉันไม่เคยเห็น;มาก่อนใน Linux
phuclv

10
@ LưuVĩnhPhúcใน sh-style shells ;หมายถึงเรียกใช้คำสั่งแรกรอให้เสร็จสิ้นจากนั้นเรียกใช้คำสั่งที่สอง &หมายถึงการเรียกใช้คำสั่งแรกวางไว้ที่พื้นหลังและเรียกใช้คำสั่งที่สอง ดังนั้นทั้งสองโปรแกรมจึงเปิดขึ้นพร้อมกัน โปรดทราบว่าสิ่งเหล่านี้ไม่ได้รวมสัญลักษณ์ แต่เป็นสัญลักษณ์ต่อท้ายกับคำสั่งแรก คุณสามารถเปิดคำสั่งเดียวในพื้นหลังด้วยprogname &โดยไม่ต้องมีคำสั่งที่สอง
MM

25

คุณสามารถใช้ & เพื่อเรียกใช้คำสั่งทีละรายการ ตัวอย่าง:c:\dir & vim myFile.txt


19

หากคุณต้องการสร้างทางลัด cmd (เช่นบนเดสก์ท็อปของคุณ) เพิ่ม / k พารามิเตอร์ (/ k หมายถึงการเก็บ / c จะปิดหน้าต่าง):

cmd /k echo hello && cd c:\ && cd Windows

16

คุณสามารถใช้การเรียกเพื่อเอาชนะปัญหาของตัวแปรสภาพแวดล้อมที่กำลังถูกประเมินได้เร็วเกินไป - เช่น

set A=Hello & call echo %A%

1
สิ่งนี้ใช้ได้เฉพาะเมื่อตัวแปรยังไม่ได้ตั้งค่าซึ่งในกรณีนี้จะechoพิมพ์ค่าเก่าไม่ใช่ค่าใหม่ อย่างน้อยนี่คือสิ่งที่ฉันสังเกตเห็นในกล่อง Windows 7 ของฉัน
Craig M. Brandenburg

ฉันใช้ set A = ก่อนเพื่อให้แน่ใจว่าตัวแปรไม่ได้ถูกตั้งค่า
SSi

1
วิธีที่ดีกว่าคือการใช้การขยายที่ล่าช้า ( setlocal EnableDelayedExpansionในสคริปต์หรือcmd /v) ตัวอย่างเช่นtimeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
นิค

5
ใช้ ^ หลังจากเปอร์เซ็นต์แรกเพื่อรับค่าใหม่: set A = สวัสดี & โทร echo% ^ A%
Nicolas

9

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

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

ดังที่คุณเห็นในตัวอย่างด้านบนเมื่อวางคำสั่งที่ใช้ตัวแปรไว้ในบรรทัดเดียวกันคุณต้องใช้การขยายที่ล่าช้าเพื่ออัปเดตค่าตัวแปรของคุณ หากตัวแปรของคุณได้รับการจัดทำดัชนีให้ใช้คำสั่ง CALL พร้อมด้วยตัวดัดแปลง %% เพื่ออัปเดตค่าของมันในบรรทัดเดียวกัน:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5

ตัวอย่างที่ให้มาใช้ไม่ได้สำหรับฉัน แต่มีตัวอย่างด้านล่าง:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw

8

cmd /c ipconfig /all & Output.txt

คำสั่งนี้รันคำสั่งและเปิดOutput.txtไฟล์ในคำสั่งเดียว


8

ดังนั้นฉันจึงพยายามเปิดใช้งานเฉพาะของการเรียกใช้RegAsm(ลงทะเบียนชุดประกอบ) จากเมนูบริบท ปัญหาที่ฉันมีคือผลลัพธ์จะกระพริบและหายไปก่อนที่ฉันจะอ่านได้ ดังนั้นฉันจึงพยายามไพพ์ไปPauseซึ่งไม่ทำงานเมื่อคำสั่งล้มเหลว (ดังที่กล่าวไว้ที่นี่หยุดชั่วคราวคำสั่งไม่ทำงานในสคริปต์. batและที่นี่คำสั่งไฟล์แบทช์หยุดชั่วคราวไม่ทำงาน ) ดังนั้นฉันจึงพยายามcmd /kแต่เปิดหน้าต่างทิ้งไว้สำหรับคำสั่งเพิ่มเติม (ฉันแค่ต้องการอ่านผล) ดังนั้นฉันจึงเพิ่มpauseตามด้วยexitลงใน chain ทำให้ได้ผลลัพธ์ดังนี้:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

สิ่งนี้ใช้งานได้อย่างมีเสน่ห์ - RegAsm ทำงานกับไฟล์และแสดงผลลัพธ์จากนั้นจะมีข้อความแจ้งว่า "กดปุ่มใด ๆ เพื่อดำเนินการต่อ ... " จากนั้นหน้าต่างพร้อมรับคำสั่งจะปิดลงเมื่อมีการกดปุ่ม

PS สำหรับคนอื่น ๆ ที่อาจสนใจคุณสามารถใช้รายการไฟล์. reg ต่อไปนี้เพื่อเพิ่มการเชื่อมโยง dllfile ไปยังไฟล์. dll และจากนั้นนามสกุลคำสั่ง RegAsm ไปที่ (สังเกตคำพูดที่หลบหนีและแบ็กสแลช)

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"

ตอนนี้ฉันมีเมนูคลิกขวาที่ดีในการลงทะเบียนการชุมนุม



4

ในการดำเนินการสองคำสั่งพร้อมกันคุณต้องใส่สัญลักษณ์ & (เครื่องหมาย) ระหว่างคำสั่งทั้งสอง ชอบมาก

color 0a & start chrome.exe

ไชโย!


4

ฉันพยายามที่จะมีสอง ping ในหน้าต่างเดียวกันและมันเป็นคำสั่งอนุกรมในบรรทัดเดียวกัน หลังจากเสร็จสิ้นคำสั่งแรกให้รันคำสั่งที่สอง

วิธีแก้ไขคือการรวมกับstart /bพรอมต์คำสั่งของ Windows 7

เริ่มตามปกติไม่/bเปิดและเปิดในหน้าต่างใหม่

คำสั่งที่ใช้เรียกใช้ในบรรทัดเดียวกันคือ:

start /b command1 parameters & command2 parameters

ไม่ว่าด้วยวิธีใดถ้าคุณต้องการแยกเอาต์พุตฉันไม่แนะนำให้ใช้สิ่งนี้ ฉันสังเกตเห็นว่าสัญญาณรบกวนระหว่างเอาท์พุทของคำสั่ง


4

คุณมีสองทางเลือกคือ Piping หรือเพียงแค่&:

DIR /S & START FILE.TXT

หรือ,

tasklist | find "notepad.exe"

Piping ( |) เป็นมากกว่าสำหรับการเอาท์พุทของคำสั่งหนึ่งและวางไว้ในอีกคำสั่งหนึ่ง และ ( &) ก็แค่บอกว่าใช้นี่และนั่นก็คือ


คุณสามารถแก้ไขโพสต์ของคุณเพื่อรวมคำอธิบายสิ่งที่ทำ&และ|ทำและแตกต่างกันอย่างไรถ้าทั้งหมด? ตอนนี้ผู้คนที่ไม่คุ้นเคยกับแนวคิดเหล่านี้ไม่สามารถตัดสินใจด้วยตนเองได้ว่าควรใช้สิ่งใดในกรณีของตน
Mirek Długosz

เช่นเดียวกับฉัน ความผิดฉันเอง. ฉันจะแก้ไขโพสต์ทันที ขอบคุณมัน
PyDever

ควรเป็น "findstr" แทน "find"
Anu Shibin Joseph Raj

2

ไม่cd / && tree && echo %time%. เวลาที่สะท้อนคือเมื่อคำสั่งแรกถูกดำเนินการ

ท่อมีปัญหาบางอย่าง แต่ก็ไม่สำคัญตราบใดที่คนรู้ว่ามันทำงานอย่างไร


1

อีกหนึ่งตัวอย่าง: ตัวอย่างเช่นเมื่อเราใช้gulpระบบการสร้างแทนที่จะเป็น

gulp - ค่าเริ่มต้น> บิลด์

gulp build - สร้าง build-folder

gulp watch - เริ่ม file-watch

gulp dist - สร้าง dist-folder

เราสามารถทำได้ด้วยหนึ่งบรรทัด:

cd c:\xampp\htdocs\project & gulp & gulp watch

1

เมื่อคุณพยายามที่จะใช้หรือจัดการกับตัวแปรในหนึ่งบรรทัดระวังเนื้อหาของพวกเขา! เช่นตัวแปรดังต่อไปนี้

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

อาจนำไปสู่ปัญหาที่ไม่สามารถแก้ไขได้จำนวนมากหากคุณใช้เป็น %PATH%

  1. วงเล็บปิดจะยกเลิกคำสั่งกลุ่มของคุณ
  2. เครื่องหมายคำพูดคู่ไม่อนุญาตให้คุณใช้%PATH%จัดการกับปัญหาในวงเล็บ
  3. และตัวแปรที่ถูกอ้างอิงเช่นนั้นจะ%USERPROFILE%มีอะไร?

2
สิ่งนี้เกี่ยวข้องกับการรันสองคำสั่งในหนึ่งบรรทัดใน Windows CMD?
Peter Mortensen

0

ใช่แล้ว &มัน

&& จะดำเนินการคำสั่ง 2 เมื่อคำสั่ง 1 เสร็จสมบูรณ์หากไม่ได้ล้มเหลว

& จะดำเนินการโดยไม่คำนึงถึง


0

ใช้&สัญลักษณ์ใน windows เพื่อใช้คำสั่งในหนึ่งบรรทัด

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

เหมือนใน linux ที่เราใช้

touch thisfile ; ls -lstrh

-2

ง่ายมากเพียงแค่สร้างความแตกต่างด้วย&&สัญญาณ ตัวอย่าง:

echo "Hello World" && echo "GoodBye World".

"Goodbye World" จะถูกพิมพ์หลังจาก "Hello World"


6
เป็นอิสระจากความจริงที่ว่ามีคำตอบเก่าที่แสดงเหมือนกันมันยังไม่ถูกต้องนัก &&เป็นตัวดำเนินการตามเงื่อนไขคำสั่งถัดไปจะดำเนินการเฉพาะเมื่อคำสั่งแรกที่ประสบความสำเร็จ (errorlevel = 0)
jeb

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

1
Rajan: เขาหมายถึง "คำสั่งถัดไปจะดำเนินการก็ต่อเมื่อคำสั่งแรกสำเร็จ"
Ivan

2
" Goodbye World จะถูกพิมพ์หลังจาก Hello World " หากการพิมพ์Hello Worldไม่ได้ล้มเหลว ตามที่ @jeb ได้กล่าวไว้ว่า&&เป็นเงื่อนไข &รันคำสั่งโดยไม่คำนึงว่าก่อนหน้านี้ประสบความสำเร็จหรือไม่
.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.