รันคำสั่งหลายคำสั่งด้วย 1 บรรทัดใน commandline Windows หรือไม่


65

ฉันจะรันคำสั่งหลายคำสั่งใน commandline Windows ด้วยบรรทัดเดียวได้อย่างไร

ตัวอย่างเช่นบอกว่าฉันต้องการทำการอัปเดต SVN แล้วคัดลอกไฟล์ทั้งหมดไปยังตำแหน่งอื่น ...

svn update; copy *.* c:\development\copy\

เห็นได้ชัดว่าไม่ได้ผล มีอักขระหรือตัวคั่นเหมือน ';' ทำอะไรแบบนี้?

คำตอบ:


105

ใช่แล้ว &มัน

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

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


7
&และ&&ใช้ได้เฉพาะใน Windows ' cmd.exe- ซึ่งไม่ใช่ DOS
grawity

22
'DOS' เป็นคำที่มักใช้เพื่ออธิบาย cmd และเมื่อเห็นว่า op ใช้ svn ฉันสงสัยอย่างมากว่าเขายังคงใช้ DOS ไม่จำเป็นต้องอวดความรู้ :)
Phoshi

ที่นั่น: urlencode.blogspot.com/2009/06/vista-desktop-june-09.htmlเขาใช้ Windows XP ไม่แน่นอน DOS (มันไม่เคยมองที่ดี;))
Phoshi

8
ฉันคิดว่ามันปลอดภัยที่จะสมมติว่าเมื่อทุกคนพูดถึง "DOS" พวกเขาหมายถึง "Windows Command Prompt" จริงๆ ฉันจะออกไปข้างนอกที่นี่และบอกว่าคนส่วนใหญ่อาจไม่ได้ใช้ DOS มากในวันนี้ ขอบคุณสำหรับการแก้ไข - มันไม่จำเป็นเลยสักนิดในยุคนี้
Murdoch Ripper

@MurdochRipper คุณหมายถึงอะไร ฉันกำลังดูคำถามนี้ใน DOS ทันที ;)
แอนดรู

4

อย่างน้อยใน MS-DOS 6.22 ฉันเคยใช้ปุ่มCtrl+ Tเพื่อรับสัญลักษณ์ย่อหน้า สิ่งนี้ได้ผลเหมือนกับที่&Phoshi พูดถึง สิ่งนี้จะใช้งานได้หากคุณเปิดใช้งาน doskey.exe


4

หากคุณต้องการรันคำสั่งหลายคำสั่งด้วย 1 บรรทัดที่คุณกำลังเริ่มคำสั่งด้วยstartเช่นหากคุณต้องการรันคำสั่งแบบนี้:

start "" netsh dump && pause

จากนั้นคุณต้องดำเนินการใน 2 ขั้นตอน (โซลูชันหนึ่งบรรทัดอยู่ท้ายคำตอบนี้)

ก่อนอื่นให้เขียนคำสั่งไปยังไฟล์แบตช์ชั่วคราว (ในกรณีนี้คุณสามารถใช้&หรือ&&):

echo netsh dump ^&^& pause ^&^& exit>foobar.cmd
  -or-
echo netsh dump ^& pause ^& exit>foobar.cmd

โปรดทราบว่าคุณต้อง "หลบหนี" แต่ละอันด้วย"&"sเครื่องหมายแอมเปอร์แซนด์"^" เพื่อให้พวกเขาถือว่าเป็นอักขระสามัญในechoคำสั่ง หรือคุณสามารถสร้างไฟล์แบตช์ชั่วคราวด้วยตัวแก้ไขข้อความเช่น Notepad

จากนั้นใช้startเพื่อเริ่มแบตช์ไฟล์:

start "" foobar.cmd
  -or-
start "" "temporary foobar.cmd"


หมายเหตุ:คู่ที่ว่างเปล่าของเครื่องหมายคำพูดคู่สำหรับ"Title"นั้นจะปรากฏในแถบชื่อเรื่องของหน้าต่างคำสั่งที่startจะเปิด "Title"อาร์กิวเมนต์นี้เป็นเทคนิคที่เป็นทางเลือกอาร์กิวเมนต์startแต่จำเป็นจริง ๆถ้าคำสั่งที่startจะเรียกใช้จะถูกยกมาสองครั้ง ตัวอย่างเช่นในตัวอย่างที่สอง:

start "" "temporary foobar.cmd"

หากคุณไม่ใส่เครื่องหมายอัญประกาศคู่ว่างเช่นนี้:

start "temporary foobar.cmd"

จากนั้นstartจะเปิดหน้าต่างคำสั่งใหม่และใช้"temporary foobar.cmd"เป็นหน้าต่างคำสั่งใหม่"Title"และจะไม่มีการดำเนินการใด ๆ ในหน้าต่างคำสั่งใหม่)

หากคุณต้องการstartรอให้ไฟล์แบตช์เสร็จสมบูรณ์ (หลังจากpauseถูกไล่ออก) ก่อนที่จะstartเสร็จสมบูรณ์คุณต้องเพิ่ม/wสวิตช์ไปยังstartคำสั่ง:

start "" /w foobar.cmd

คุณสามารถรวมทั้งหมดเข้าด้วยกันในหนึ่งบรรทัดและแม้แต่ลบ (ลบ) ไฟล์แบตช์ชั่วคราว ( foobar.cmd):

echo netsh dump ^&^& pause ^&^& exit>foobar.cmd && start "" /w foobar.cmd && del foobar.cmd
  -or-
echo netsh dump ^& pause ^& exit>foobar.cmd & start "" /w foobar.cmd & del foobar.cmd

โปรดทราบว่าหากคุณจะลบไฟล์แบตช์ชั่วคราวคุณจะต้องรันstartด้วย/wสวิตช์มิฉะนั้นไฟล์แบทช์ชั่วคราวอาจถูกลบก่อนที่จะมีโอกาสเรียกใช้


แทนที่จะใช้/wวิธีใดวิธีหนึ่งให้พักระยะเวลาสั้น ๆก่อนที่จะลบไฟล์ timeout 2จะทำมันเช่น
อันโตนิโอ

@ kevin-fegan ทำไมคุณถึงต้องการไฟล์ cmd ชั่วคราว ???
maxxyme

0

ในกรณีที่คุณต้องการตัดคำสั่งแรกด้วย if แต่ยังต้องการให้คำสั่งที่สองดำเนินการโดยไม่คำนึงถึงจากนั้นคุณจะต้องตัดคำสั่ง if ด้วย cmd / c เช่นนี้:

cmd / c ถ้ามีอยู่ abc (rd / q abc) & echo สวัสดี

หากคุณไม่ได้ใส่คำนำหน้า if ด้วย cmd / c คำสั่งทั้งหมดจะกลายเป็นส่วนหนึ่งของ if (ซึ่งคุณอาจไม่ต้องการ)


หรือคุณอาจพูดว่า(if exist abc. command₁) & command₂
สกอตต์

@Scott ฉันรู้ว่าคำชมเป็นบาปในเว็บไซต์เหล่านี้ แต่start "" cmd /c "(command₁) & (command₂)"ไม่ได้รับคำตอบถูกกฎหมายที่ใดก็ได้บนเว็บ แต่เป็นวิธีเดียวที่จะเชื่อมโยงชุดคำสั่งส่วนใหญ่ได้ ขอแสดงความยินดีกับคุณ
John Kens

1
ฉันขอชมเชย / แสดงความยินดี แต่ฉันไม่เข้าใจสิ่งที่คุณกำลังพูด user138334 กล่าวว่า“ในกรณีที่คุณต้องการที่จะตัดคำสั่งแรกที่มีifแต่จะยังคงเหมือนคำสั่งที่สองที่จะดำเนินการโดยไม่คำนึงถึงแล้วแล้วคุณจะต้องห่อifด้วยcmd /cเช่นกัน” cmd /cและผมก็ตอบโต้ด้วยวิธีการทำมันได้โดยไม่ต้อง ดังนั้นทำไมคุณบอกว่าวิธีเดียวที่จะเชื่อมโยงชุดงบมากที่สุดคือการใช้cmd /c? และทำไมคุณถึงโยนstartลงไปในส่วนผสม?
สกอตต์

0

ใช่ใช้&!

%command1% & %command2% รันคำสั่งทั้งสอง

%command1% && %command2% รันคำสั่งแรกหากทำงานได้ให้รันคำสั่งที่สอง

%command1% || %command2% รันคำสั่งแรกหากไม่สำเร็จให้รันคำสั่งวินาที

ดูที่นี่


และยัง&, &&และ||จะไม่จริงคำสั่งมันเป็นส่วนหนึ่งของชุด ไม่ใช่คำสั่ง
KIRBY INHALES U

และ%command%สามารถรันสตริงนั้นเป็นคำสั่งได้ที่นี่
KIRBY INHALES U

-1

ฉันพบว่าการใช้ 'เริ่ม' แก้ไขคำสั่งหลายคำสั่งทำงานได้ (ฉันใช้ Windows 10 Home) ตัวอย่างเช่น:

START chrome.exe "page.web.com" & timeout 20

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

สิ่งที่เขามองหาคือ&ไม่ใช่start!
NetwOrchestration

สิ่งนี้แก้ปัญหาอะไรได้บ้าง จะเกิดอะไรขึ้นเมื่อคุณพิมพ์บรรทัดคำสั่งโดยไม่start?
สกอตต์

-2

ทำให้แบทช์ไฟล์ที่มีชื่อสั้น ๆ เช่นbat.bat

add cmd /c %1 
    cmd /c %2 
rem

และอื่น ๆ ถึง 9 บรรทัดและบันทึก

จากนั้นใช้กับเครื่องหมายคำพูดคู่

bat "command one" "command two" "command three" 

cmd /c จะเรียกใช้แต่ละคำสั่งและปิดการทำงานสำหรับบรรทัดถัดไปโดยไม่บอกว่านี่ดีกว่า && เพียงแค่ว่าง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.