ฉันต้องการเรียกใช้สองคำสั่งในคอนโซล Windows CMD
ใน Linux ฉันจะทำเช่นนี้
touch thisfile ; ls -lstrh
มันทำบน Windows ได้อย่างไร?
ฉันต้องการเรียกใช้สองคำสั่งในคอนโซล Windows CMD
ใน Linux ฉันจะทำเช่นนี้
touch thisfile ; ls -lstrh
มันทำบน Windows ได้อย่างไร?
คำตอบ:
เช่นนี้ใน 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
คำพูดจากเอกสาร:
การใช้หลายคำสั่งและสัญลักษณ์การประมวลผลตามเงื่อนไข
คุณสามารถเรียกใช้หลายคำสั่งจากบรรทัดคำสั่งเดียวหรือสคริปต์โดยใช้สัญลักษณ์การประมวลผลตามเงื่อนไข เมื่อคุณรันหลายคำสั่งด้วยสัญลักษณ์การประมวลผลแบบมีเงื่อนไขคำสั่งทางด้านขวาของสัญลักษณ์การประมวลผลแบบมีเงื่อนไขจะขึ้นอยู่กับผลลัพธ์ของคำสั่งทางด้านซ้ายของสัญลักษณ์การประมวลผลแบบมีเงื่อนไข
ตัวอย่างเช่นคุณอาจต้องการเรียกใช้คำสั่งเฉพาะเมื่อคำสั่งก่อนหน้านี้ล้มเหลว หรือคุณอาจต้องการเรียกใช้คำสั่งเฉพาะเมื่อคำสั่งก่อนหน้านี้ประสบความสำเร็จ
คุณสามารถใช้อักขระพิเศษที่แสดงรายการในตารางต่อไปนี้เพื่อส่งผ่านหลายคำสั่ง
& [...]
command1 & command2
ใช้เพื่อแยกหลายคำสั่งในหนึ่งบรรทัดคำสั่ง Cmd.exe เรียกใช้คำสั่งแรกแล้วคำสั่งที่สอง
&& [...]
command1 && command2
ใช้เพื่อเรียกใช้คำสั่งดังต่อไปนี้ && ถ้าคำสั่งที่อยู่ข้างหน้าสัญลักษณ์นั้นสำเร็จเท่านั้น Cmd.exe เรียกใช้คำสั่งแรกแล้วเรียกใช้คำสั่งที่สองเฉพาะเมื่อคำสั่งแรกเสร็จสมบูรณ์แล้ว
|| [...]
command1 || command2
ใช้เพื่อเรียกใช้คำสั่งต่อไปนี้ || เฉพาะในกรณีที่คำสั่งก่อนหน้า | | ล้มเหลว Cmd.exe เรียกใช้คำสั่งแรกแล้วเรียกใช้คำสั่งที่สองก็ต่อเมื่อคำสั่งแรกดำเนินการไม่สำเร็จ (ได้รับรหัสข้อผิดพลาดมากกว่าศูนย์)
( ) [...]
(command1 & command2)
ใช้เพื่อจัดกลุ่มหรือซ้อนหลายคำสั่ง
; or ,
command1 parameter1;parameter2
ใช้เพื่อแยกพารามิเตอร์คำสั่ง
cmd /c "echo foo & echo bar"ดู
vagrant up && vagrant sshทำงานโดยไม่มีเครื่องหมายอัญประกาศใน Windows 10
&- ทำให้มันไม่ตรงกันและทำงานทั้งคู่ขนานกัน ฉันติดขัดเพราะฉันใช้&&กับมันเป็นแบบซิงโครนัสและจะดำเนินต่อไปถ้าประสบความสำเร็จครั้งแรก!
&ไม่ได้ทำคำสั่งแบบอะซิงโครนัสหรือขนาน command1 & command2จะทำงานcommand2 หลังจาก command1เสร็จสิ้น ความสำเร็จหรือความล้มเหลวของcommand1ไม่เกี่ยวข้อง
&เป็น Bash ที่เทียบเท่ากับ;(คำสั่ง run) และ&&เทียบเท่ากับ Bash &&(คำสั่ง run เฉพาะเมื่อก่อนหน้านี้ไม่ได้ทำให้เกิดข้อผิดพลาด)
;มาก่อนใน Linux
;หมายถึงเรียกใช้คำสั่งแรกรอให้เสร็จสิ้นจากนั้นเรียกใช้คำสั่งที่สอง &หมายถึงการเรียกใช้คำสั่งแรกวางไว้ที่พื้นหลังและเรียกใช้คำสั่งที่สอง ดังนั้นทั้งสองโปรแกรมจึงเปิดขึ้นพร้อมกัน โปรดทราบว่าสิ่งเหล่านี้ไม่ได้รวมสัญลักษณ์ แต่เป็นสัญลักษณ์ต่อท้ายกับคำสั่งแรก คุณสามารถเปิดคำสั่งเดียวในพื้นหลังด้วยprogname &โดยไม่ต้องมีคำสั่งที่สอง
คุณสามารถใช้ & เพื่อเรียกใช้คำสั่งทีละรายการ ตัวอย่าง:c:\dir & vim myFile.txt
หากคุณต้องการสร้างทางลัด cmd (เช่นบนเดสก์ท็อปของคุณ) เพิ่ม / k พารามิเตอร์ (/ k หมายถึงการเก็บ / c จะปิดหน้าต่าง):
cmd /k echo hello && cd c:\ && cd Windows
คุณสามารถใช้การเรียกเพื่อเอาชนะปัญหาของตัวแปรสภาพแวดล้อมที่กำลังถูกประเมินได้เร็วเกินไป - เช่น
set A=Hello & call echo %A%
echoพิมพ์ค่าเก่าไม่ใช่ค่าใหม่ อย่างน้อยนี่คือสิ่งที่ฉันสังเกตเห็นในกล่อง Windows 7 ของฉัน
setlocal EnableDelayedExpansionในสคริปต์หรือcmd /v) ตัวอย่างเช่นtimeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
สามารถใช้สัญลักษณ์การประมวลผลจำนวนหนึ่งเมื่อรันหลายคำสั่งในบรรทัดเดียวกันและอาจนำไปสู่การประมวลผลการเปลี่ยนเส้นทางในบางกรณีการแก้ไขเอาต์พุตในกรณีอื่นหรือเพียงแค่ล้มเหลว กรณีที่สำคัญอย่างหนึ่งคือการวางคำสั่งบรรทัดคำสั่งเดียวกันที่จัดการตัวแปร
@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!%"
cmd /c ipconfig /all & Output.txt
คำสั่งนี้รันคำสั่งและเปิดOutput.txtไฟล์ในคำสั่งเดียว
ดังนั้นฉันจึงพยายามเปิดใช้งานเฉพาะของการเรียกใช้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"
ตอนนี้ฉันมีเมนูคลิกขวาที่ดีในการลงทะเบียนการชุมนุม
ในการดำเนินการสองคำสั่งพร้อมกันคุณต้องใส่สัญลักษณ์ & (เครื่องหมาย) ระหว่างคำสั่งทั้งสอง ชอบมาก
color 0a & start chrome.exe
ไชโย!
ฉันพยายามที่จะมีสอง ping ในหน้าต่างเดียวกันและมันเป็นคำสั่งอนุกรมในบรรทัดเดียวกัน หลังจากเสร็จสิ้นคำสั่งแรกให้รันคำสั่งที่สอง
วิธีแก้ไขคือการรวมกับstart /bพรอมต์คำสั่งของ Windows 7
เริ่มตามปกติไม่/bเปิดและเปิดในหน้าต่างใหม่
คำสั่งที่ใช้เรียกใช้ในบรรทัดเดียวกันคือ:
start /b command1 parameters & command2 parameters
ไม่ว่าด้วยวิธีใดถ้าคุณต้องการแยกเอาต์พุตฉันไม่แนะนำให้ใช้สิ่งนี้ ฉันสังเกตเห็นว่าสัญญาณรบกวนระหว่างเอาท์พุทของคำสั่ง
คุณมีสองทางเลือกคือ Piping หรือเพียงแค่&:
DIR /S & START FILE.TXT
หรือ,
tasklist | find "notepad.exe"
Piping ( |) เป็นมากกว่าสำหรับการเอาท์พุทของคำสั่งหนึ่งและวางไว้ในอีกคำสั่งหนึ่ง และ ( &) ก็แค่บอกว่าใช้นี่และนั่นก็คือ
&และ|ทำและแตกต่างกันอย่างไรถ้าทั้งหมด? ตอนนี้ผู้คนที่ไม่คุ้นเคยกับแนวคิดเหล่านี้ไม่สามารถตัดสินใจด้วยตนเองได้ว่าควรใช้สิ่งใดในกรณีของตน
ไม่cd / && tree && echo %time%. เวลาที่สะท้อนคือเมื่อคำสั่งแรกถูกดำเนินการ
ท่อมีปัญหาบางอย่าง แต่ก็ไม่สำคัญตราบใดที่คนรู้ว่ามันทำงานอย่างไร
อีกหนึ่งตัวอย่าง: ตัวอย่างเช่นเมื่อเราใช้gulpระบบการสร้างแทนที่จะเป็น
gulp - ค่าเริ่มต้น> บิลด์
gulp build - สร้าง build-folder
gulp watch - เริ่ม file-watch
gulp dist - สร้าง dist-folder
เราสามารถทำได้ด้วยหนึ่งบรรทัด:
cd c:\xampp\htdocs\project & gulp & gulp watch
เมื่อคุณพยายามที่จะใช้หรือจัดการกับตัวแปรในหนึ่งบรรทัดระวังเนื้อหาของพวกเขา! เช่นตัวแปรดังต่อไปนี้
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
อาจนำไปสู่ปัญหาที่ไม่สามารถแก้ไขได้จำนวนมากหากคุณใช้เป็น %PATH%
%PATH%จัดการกับปัญหาในวงเล็บ%USERPROFILE%มีอะไร?ใช่แล้ว &มัน
&& จะดำเนินการคำสั่ง 2 เมื่อคำสั่ง 1 เสร็จสมบูรณ์หากไม่ได้ล้มเหลว
& จะดำเนินการโดยไม่คำนึงถึง
ใช้&สัญลักษณ์ใน windows เพื่อใช้คำสั่งในหนึ่งบรรทัด
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
เหมือนใน linux ที่เราใช้
touch thisfile ; ls -lstrh
ง่ายมากเพียงแค่สร้างความแตกต่างด้วย&&สัญญาณ ตัวอย่าง:
echo "Hello World" && echo "GoodBye World".
"Goodbye World" จะถูกพิมพ์หลังจาก "Hello World"
&&เป็นตัวดำเนินการตามเงื่อนไขคำสั่งถัดไปจะดำเนินการเฉพาะเมื่อคำสั่งแรกที่ประสบความสำเร็จ (errorlevel = 0)
Hello Worldไม่ได้ล้มเหลว ตามที่ @jeb ได้กล่าวไว้ว่า&&เป็นเงื่อนไข &รันคำสั่งโดยไม่คำนึงว่าก่อนหน้านี้ประสบความสำเร็จหรือไม่