คำสั่ง CALL กับ START ด้วยตัวเลือก / WAIT


149

คำสั่ง START เป็นอย่างไรกับตัวเลือก WAIT

START /wait notepad.exe 
START /wait  notepad.exe 

... แตกต่างจากการใช้คำสั่ง CALL หรือไม่?

CALL notepad.exe 
CALL notepad.exe 

มีสถานการณ์ที่บางคนอาจมีพฤติกรรมแตกต่างกันหรือไม่ขึ้นอยู่กับสิ่งที่กำลังถูกประหารชีวิต?


2
ลองดูที่technet.microsoft.com/en-us/library/bb491005.aspxเป็นเรื่องเกี่ยวกับ START และtechnet.microsoft.com/en-us/library/bb490873.aspxเป็นเรื่องเกี่ยวกับ CALL
นักพัฒนา

คำตอบ:


183

สำหรับไฟล์exeฉันคิดว่าความแตกต่างนั้นแทบไม่สำคัญเลย
แต่การที่จะเริ่มต้นexeCALLคุณไม่จำเป็นต้องแม้กระทั่ง

เมื่อเริ่มต้นชุดอื่นเป็นความแตกต่างใหญ่
เช่นCALLจะเริ่มต้นในหน้าต่างเดียวกันและชุดที่เรียกว่ามีการเข้าถึงบริบทตัวแปรเดียวกัน
ดังนั้นจึงสามารถเปลี่ยนตัวแปรที่มีผลต่อผู้โทร

STARTจะสร้าง cmd.exe ใหม่สำหรับชุดที่เรียกและไม่มี / b มันจะเปิดหน้าต่างใหม่
เนื่องจากเป็นบริบทใหม่จึงไม่สามารถแชร์ตัวแปรได้

ความแตกต่าง

การใช้start /wait <prog>
- การเปลี่ยนแปลงของตัวแปรสภาพแวดล้อมจะหายไปเมื่อ<prog>สิ้นสุด
- ผู้เรียกรอจนกว่า<prog>จะเสร็จสิ้น

การใช้call <prog>
- ให้exeก็สามารถ ommited เพราะมันเท่ากับเพียงการเริ่มต้น<prog>
- สำหรับexe-progรอโทรชุดหรือเริ่มexeไม่ตรงกัน แต่พฤติกรรมขึ้นอยู่กับexeตัวเอง
- สำหรับแบตช์ไฟล์แบทช์ผู้โทรจะดำเนินต่อไปเมื่อการเรียก<batch-file>เสร็จสิ้นโดยไม่เรียกการควบคุมจะไม่กลับไปที่แบทช์ผู้โทร

ภาคผนวก:

การใช้CALLสามารถเปลี่ยนพารามิเตอร์ (สำหรับแบตช์และไฟล์ exe) แต่เฉพาะเมื่อมีคาเร็ตหรือเครื่องหมายเปอร์เซ็นต์

call myProg param1 param^^2 "param^3" %%path%%

จะถูกขยายเป็น (จากภายในไฟล์แบตช์)

myProg param1 param2 param^^3 <content of path>

25
เมื่อเรียกใช้งาน file.bat โดยใช้ START / WAIT คุณต้องระบุ START / WAIT cmd / c "file.bat" แทนที่จะเป็นเพียง START / WAIT "file.bat" มิฉะนั้นหน้าต่าง cmd ที่สร้างขึ้นสำหรับ file.bat จะยังคงเปิดอยู่
FrinkTheBrave

5
คุณสามารถค้นหาการเปรียบเทียบระหว่าง CALL กับ START ได้ที่: ss64.com/nt/start.html (อัปเดตวันนี้ด้วยส่วน "Start / Wait" และ "START vs CALL")
Alfredo Capobianchi

ที่ฉันชอบคือstart /wait /b cmd /c <batchfile.bat>เพราะไฟล์ชุดทำงานอย่างใดอย่างหนึ่งหลังจากที่อื่น ๆ ในหน้าต่างคำสั่งเดียวกัน
linux64kb

@ linux64kb แต่สำหรับไฟล์แบทช์ไม่จำเป็นคุณต้องใช้เท่านั้นcall batchfile.bat
jeb

@jeb True ฉันชอบอันนี้เพราะแบทช์ไฟล์แต่ละไฟล์จะทำงานในสภาพแวดล้อมเชลล์คำสั่งที่แตกต่างกันการสืบทอดตัวแปรจากการเรียกเชลล์และการเปลี่ยนแปลงค่าเริ่มต้นจะหายไปหลังจากแบทช์เสร็จ -> ไม่มีขยะเหลืออยู่หลังจากการทำงานต่อเนื่องกัน ชัยชนะอีกประการหนึ่งคือคุณไม่ต้องจัดการกับการรีเซ็ตตัวแปรในสคริปต์ของคุณ
linux64kb

17

ฉันคิดว่าพวกเขาควรทำแบบเดียวกัน แต่มีความแตกต่างบางอย่าง STARTโดยทั่วไปจะใช้เพื่อเริ่มแอปพลิเคชันหรือเพื่อเริ่มแอปพลิเคชันเริ่มต้นสำหรับประเภทไฟล์ที่กำหนด วิธีที่ว่าถ้าคุณไม่ได้ทำSTART http://mywebsite.comSTART iexplore.exe http://mywebsite.com

START myworddoc.docxจะเริ่ม Microsoft Word และเปิด myworddoc.docx CALL myworddoc.docxทำสิ่งเดียวกัน ... แต่STARTมีตัวเลือกเพิ่มเติมสำหรับสถานะหน้าต่างและสิ่งต่าง ๆ ในลักษณะนั้น นอกจากนี้ยังอนุญาตให้ตั้งค่าลำดับความสำคัญของกระบวนการและความสัมพันธ์

กล่าวโดยย่อเมื่อได้รับตัวเลือกเพิ่มเติมที่ให้ไว้โดยเริ่มต้นมันควรเป็นเครื่องมือที่คุณเลือก

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.

11

มีความแตกต่างที่เป็นประโยชน์ระหว่างcallและstart /waitเมื่อมีการโทรregsvr32.exe /sเช่นอ้างอิงโดยGaryในคำตอบของเขาไปยังวิธีการทำ -i-get-the-application-exit-code-from-a-windows-command-line

call regsvr32.exe /s broken.dll
echo %errorlevel%

จะส่งคืน 0 เสมอ

start /wait regsvr32.exe /s broken.dll
echo %errorlevel%

จะส่งคืนระดับข้อผิดพลาดจาก regsvr32.exe


8

นี่คือสิ่งที่ฉันพบในขณะที่รันแบตช์ไฟล์แบบขนาน (อินสแตนซ์หลายตัวของไฟล์แบ็ตเดียวกันในเวลาเดียวกันพร้อมกับพารามิเตอร์อินพุตที่แตกต่างกัน):

ให้บอกว่าคุณมีไฟล์ exe ที่ทำงานยาวเรียกว่า LongRunningTask.exe

หากคุณเรียกใช้ exe โดยตรงจากไฟล์ bat เฉพาะการเรียกครั้งแรกไปยัง LongRunningTask จะได้รับการบังคับใช้ในขณะที่ส่วนที่เหลือจะได้รับข้อผิดพลาดของระบบปฏิบัติการ "ไฟล์ถูกใช้งานโดยกระบวนการ"

หากคุณใช้คำสั่งนี้:

พารามิเตอร์ start / B / WAIT "" "LongRunningTask.exe" ""

คุณจะสามารถเรียกใช้ bat และ exe ได้หลายอินสแตนซ์ในขณะที่ยังคงรอให้ภารกิจเสร็จสิ้นก่อนที่ค้างคาวจะดำเนินการคำสั่งที่เหลือต่อไป ตัวเลือก / B คือการหลีกเลี่ยงการสร้างหน้าต่างใหม่จำเป็นต้องใช้อัญประกาศว่างเปล่าเพื่อให้คำสั่งใช้งานได้โปรดดูการอ้างอิงด้านล่าง

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

ทำงานต่อ:

สิ่งนี้ไม่สามารถทำงานแบบขนาน:

  • เรียก LongRunningTask.exe

สิ่งนี้จะทำงานแบบขนานและจะใช้ได้ตราบใดที่ไม่มีการพึ่งพาข้อมูลระหว่างเอาต์พุตของคำสั่งและส่วนที่เหลือของไฟล์ bat:

  • พารามิเตอร์เริ่มต้น / B "" "LongRunningTask.exe" ""

สิ่งนี้จะทำงานแบบขนานและรอให้งานเสร็จดังนั้นคุณสามารถใช้เอาต์พุต:

  • พารามิเตอร์ start / B / WAIT "" "LongRunningTask.exe" ""

การอ้างอิงสำหรับคำสั่งเริ่มต้น: ฉันจะเรียกใช้โปรแกรมจากแฟ้มแบตช์โดยไม่เปิดคอนโซลทิ้งไว้หลังจากที่โปรแกรมเริ่มทำงานได้อย่างไร


6

โทร

เรียกโปรแกรมแบตช์หนึ่งจากอีกโปรแกรมหนึ่งโดยไม่หยุดโปรแกรมแบตช์หลัก คำสั่ง call ยอมรับเลเบลเป็นเป้าหมายของการโทร การโทรไม่มีผลกับบรรทัดคำสั่งเมื่อใช้นอกสคริปต์หรือไฟล์แบตช์ https://technet.microsoft.com/en-us/library/bb490873.aspx

เริ่มต้น

เริ่มต้นหน้าต่างพร้อมรับคำสั่งแยกต่างหากเพื่อเรียกใช้โปรแกรมหรือคำสั่งที่ระบุ ใช้โดยไม่มีพารามิเตอร์เริ่มต้นเปิดหน้าต่างพรอมต์คำสั่งที่สอง https://technet.microsoft.com/en-us/library/bb491005.aspx


-1

นี่เป็นหัวข้อเก่า แต่ฉันเพิ่งพบสถานการณ์นี้และค้นพบวิธีที่เรียบร้อยรอบ ๆ ฉันพยายามเรียกใช้ setup.exe แต่โฟกัสกลับไปที่บรรทัดถัดไปของสคริปต์โดยไม่ต้องรอ setup.exe ให้เสร็จ ฉันลองวิธีแก้ปัญหาข้างต้นโดยไม่มีโชค

ในที่สุดการวางคำสั่งผ่านกลอุบายทำได้มากกว่านี้

setup.exe {อาร์กิวเมนต์} | มากกว่า

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