ฉันต้องการเรียกใช้สองคำสั่งในคอนโซล 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 ได้กล่าวไว้ว่า&&
เป็นเงื่อนไข &
รันคำสั่งโดยไม่คำนึงว่าก่อนหน้านี้ประสบความสำเร็จหรือไม่