มันจะทำอย่างไรถ้าฉันคลิกในหน้าต่างของคำสั่ง?


44

สมมติว่าฉันเรียกใช้cmd.exeและ ping localhost หลังจากที่ผม ping ที่ localhost อีกครั้ง แต่ผมคลิกเข้าไปในหน้าต่างและ ping หยุดจนกว่าฉันจะกดใส่

จะเกิดอะไรขึ้นเมื่อฉันคลิกเข้าไปในหน้าต่าง มันระงับกระบวนการหรืออย่างอื่นหรือไม่? ฉันแนบภาพหน้าจอเพื่อชี้แจงปัญหานี้

หมายเหตุ: ฉันไม่ได้คลิก แต่ลากโดยใช้เมาส์ซึ่งสร้างกล่องสีขาวในหน้าต่างตามที่คุณเห็นบนหน้าจอ

แก้ไข: ชี้แจงเพิ่มเติม:สิ่งที่ฉันอยากรู้คือการลากหน้าต่างหยุดกระบวนการ cmd หรือไม่?

แก้ไข: ความกระจ่างมากขึ้น:ฉันรู้ว่าฉันกำลังใช้การแก้ไขอย่างรวดเร็วและกด Enter คัดลอกเนื้อหาที่ฉันเลือก สิ่งที่ฉันไม่รู้คือสิ่งที่เกิดขึ้นในพื้นหลัง

ป้อนคำอธิบายรูปภาพที่นี่


2
BTW คุณสามารถลงคะแนนให้ UserVoice เพื่อให้พฤติกรรมนี้เปลี่ยนไป: wpdev.uservoice.com/forums/ …
Carl Walsh

ดี ฉันโหวตให้กับมัน
Adam Arold

การลงคะแนนเป็นเพียงการนำฉันไปที่หน้า 404
Kelly Bang

1
และที่สำคัญยิ่งกว่านี่คือวิธีการปิดการทำงานของเทพเจ้านี้ออกจากstackoverflow.com/a/37578608/463967
Alan Macdonald

คำตอบ:


27

เมื่อคุณเลือกข้อความในหน้าต่าง cmd.exe กระบวนการจะดำเนินการในพื้นหลังจนกว่าจะถึงครั้งถัดไปที่จะเขียนลงในเอาต์พุตมาตรฐาน (หรือ STDOUT ซึ่งเป็นสตรีมข้อมูลที่แสดงในหน้าต่าง cmd.exe)

เมื่อคุณออกจากโหมดการเลือกกระบวนการจะกลับมาทำงานตามปกติ

คุณสามารถทดสอบสิ่งนี้ได้โดยพิมพ์ping www.google.com -tลงในหน้าต่าง cmd.exe และเลือกพื้นที่บางส่วนของเอาต์พุต คุณจะเห็นมันหยุดชั่วคราวและเมื่อคุณยกเลิกการเลือกเอาท์พุทจะกลับมาทำงานต่อ

แก้ไข:ตามความคิดเห็นของ Fran คุณสามารถใช้เครื่องมือเช่น Wireshark เพื่อดูว่ากิจกรรมนั้นยังคงเกิดขึ้นหลังจากจุดเมื่อคุณทำการเลือกแล้วหยุด


3
เพียงอย่างเดียวไม่ได้ทดสอบ คุณต้องรัน Wireshark และดูว่าแพ็คเก็ต ICMP หยุดส่งหรือไม่ ถ้าเป็นเช่นนั้นคุณมีสิทธิ์ที่กระบวนการจะถูกระงับ หากไม่ใช่กระบวนการจะไม่ถูกหยุดชั่วคราวและเอาต์พุตจะถูกบัฟเฟอร์ (จนกว่าบัฟเฟอร์จะเต็มดังนั้นจะหยุดทำงานชั่วคราวหรือข้อมูลจะหายไป)
ฟราน

1
ฉันค่อนข้างแน่ใจว่า @Fran ถูกต้อง - ผลลัพธ์ทั้งหมดจะไม่ปรากฏขึ้นพร้อมกันหากคุณรอนานพอในโหมดการเลือก?
Izkata

1
สิ่งนี้ทำให้ฉันรำคาญมาก แต่ฉันพบว่าถ้าคุณไปที่คุณสมบัติของหน้าต่าง cmd คุณสามารถยกเลิกการเลือก "โหมดแก้ไขด่วน" และคุณจะไม่เข้าสู่โหมดเลือกโดยคลิกที่หน้าต่าง
Zitrax

2
@Zitrax ใช่นั่นเป็นวิธีที่คุณสามารถป้องกันไม่ให้เกิดเหตุการณ์นี้ขึ้นโดยบังเอิญ ฉันมักจะคัดลอกสิ่งต่าง ๆ จากหน้าต่างคำสั่งของฉันดังนั้นฉันจึงไม่ทำเช่นนั้น (ดีจริงผมใช้Consolezซึ่งไม่ได้มีปัญหาที่)
JohnL

1
สิ่งนี้เรียกว่า " การปิดกั้น " ... เช่น: แอปพลิเคชันเรียกใช้write()แต่ติดขัด
Attie

49

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

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

ถ้าฉันวิ่งping -t localhostและคลิกลงในหน้าต่างพร้อมรับคำสั่งจากนั้นผมก็สามารถตรวจสอบสแต็คโทรของหลักping.exeด้ายกับProcess Explorer

ป้อนคำอธิบายรูปภาพที่นี่

เราจะเห็นว่าping.exeพยายามเขียนผลลัพธ์บางอย่าง มันเรียกว่าwrite()ใน C runtime library ฟังก์ชั่นที่ในบางจุดเรียกGetConsoleMode ตามที่ดูเหมือนว่าฟังก์ชั่นนั้นจะตรวจสอบว่าผู้ใช้อยู่ในโหมดเครื่องหมายและบล็อกการดำเนินการถ้าจำเป็น

การวิเคราะห์เพิ่มเติม

เราสามารถพิสูจน์พฤติกรรมนี้เพิ่มเติมโดยการตรวจสอบพฤติกรรมของpingกับWireshark

เมื่อทำงานping -t superuser.comเราจะเห็นผลลัพธ์ต่อไปนี้ใน Wireshark:
ป้อนคำอธิบายรูปภาพที่นี่

ทีนี้มาทำเครื่องหมายกล่องในพรอมต์คำสั่ง
ป้อนคำอธิบายรูปภาพที่นี่
ทันใดนั้นก็ไม่มีการบันทึก Ping อีกต่อไปใน Wireshark pingไม่ได้ส่งแพ็กเก็ตใด ๆ อีกต่อไป

แต่เรารู้แล้วว่า ...

ใช่เรามาดูว่าผลลัพธ์เป็นปัญหาจริงหรือไม่! ลองส่งเอาต์พุตไปยังNULอุปกรณ์โดยตรง:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ไม่มี ouput อีกต่อไป ตอนนี้เราสามารถทำเครื่องหมายข้อความในกล่องตลอดทั้งวันแพ็คเก็ตจะถูกบันทึกไว้ใน Wireshark

ป้อนคำอธิบายรูปภาพที่นี่


หากฉันยังไม่ได้ +1 คำตอบดั้งเดิมฉันจะ +1 ตอนนี้สำหรับ "การวิเคราะห์เพิ่มเติม"
JohnL

6

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


และ "โหมดมาร์ค" ทำอะไรได้บ้าง มันระงับกระบวนการหรือไม่?
Adam Arold

โหมดทำเครื่องหมายใช้สำหรับคัดลอกข้อความจากหน้าต่างคำสั่ง AFAIK ที่ใช้เพียงอย่างเดียว แต่ฉันคิดว่าอาจมีคนอื่น
Garrett

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

@JohnL โปรดสร้างคำตอบเนื่องจากความคิดเห็นของคุณคือสิ่งที่ฉันกำลังมองหา
Adam Arold

@edem เพิ่มคำตอบ :)
JohnL

6

หน้าต่าง CMD ของคุณอยู่ในโหมดแก้ไขด่วนซึ่งเข้าสู่โหมดแก้ไขโดยอัตโนมัติเมื่อคุณคลิกบนหน้าจอ Enter ใช้สำหรับคัดลอกข้อความในกล่องสีขาวและออกจากโหมดแก้ไข

โดยปกติ CMD จะเข้าสู่โหมดแก้ไขเฉพาะเมื่อคุณคลิกขวาบนหน้าจอสีดำและเลือกทำเครื่องหมาย

หากต้องการเปลี่ยนกลับเป็นปกติให้คลิกขวาบนแถบชื่อเรื่องของหน้าต่างและเลือกคุณสมบัติเลือกแท็บตัวเลือกแล้วยกเลิกการเลือก "โหมดแก้ไขด่วน" แล้วคลิกตกลง


3

เมื่อคุณเลือกข้อความที่จะคัดลอกจากหน้าต่าง (เมื่ออยู่ในMarkโหมด) ระบบจะระงับกระบวนการปัจจุบันในหน้าต่างนั้น

ไฟล์แบตช์ตัวอย่าง:

:test
echo %0
goto test

เมื่อสิ่งนี้ถูกเรียกใช้ทันทีที่ฉันทำเครื่องหมายพื้นที่ที่จะคัดลอกหน้าจอจะหยุดการเลื่อน


ฉันกำลังจะโพสต์สิ่งเดียวกันแน่นอน (ยกเว้นไฟล์แบทช์ของฉันecho blah↵%0) :-)
Synetech

1

เนื่องจากทุกคนได้ชี้ให้เห็นอย่างชัดเจนว่าความคืบหน้าของการส่งออกเพิ่มเติมถูกบล็อกในขณะที่การดำเนินการเครื่องหมายอยู่ในความคืบหน้า นอกจากนี้ไม่ว่าจะใช้การคลิกเมาส์แบบอื่น (คลิกขวาโดยค่าเริ่มต้น) หรือโดยการกดปุ่ม Enter บนแป้นพิมพ์ของคุณคุณสามารถออกจากโหมด Mark และคัดลอกการเลือกที่ทำเครื่องหมายไว้ในบัฟเฟอร์การวางของ Windows มีอีกวิธีหนึ่งคือการกดแป้น Esc เพื่อยกเลิกการทำเครื่องหมายพื้นที่หน้าจอและปล่อยบล็อกบนเอาต์พุต นี่ถือว่าคุณได้เลือกโหมด QuickEdit ในคุณสมบัติของหน้าต่างคำสั่งนั้น คุณสามารถเข้าสู่สถานการณ์นี้ได้อย่างจงใจยิ่งขึ้นโดยบอกหน้าต่างคำสั่งที่คุณต้องการเลือกข้อความ


0

เพื่อยืนยันคำสั่งเพิ่มเติมว่ากระบวนการหยุดใน "โหมดมาร์ค" เช่นในระหว่างการคลิกเมาส์หรือลากภายในกรอบหน้าต่าง cmd.exe แต่หยุดการดำเนินการใด ๆ หลังจากเสร็จสิ้นอินสแตนซ์ที่เสร็จสมบูรณ์แล้วฉันเสนอหลักฐานทางอ้อม:

[1378:000f][2018-10-08T13:26:20] END: Verifying package "AndroidEmulator,version=26.0.0.2"
[1378:000f][2018-10-08T13:26:20] BEGIN: Verifying package "AndroidImage_ARM_API23,version=20.0.0.3"
[1378:000f][2018-10-08T13:26:20] Verifying package 'AndroidImage_ARM_API23,version=20.0.0.3'
[1378:000c][2018-10-08T13:26:26] SHA256 verification for 'AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip' succeeded. Hash: X
[1378:0025][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\AndroidSDKPrivateInstall.ps1"
[1378:0012][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip"
[1378:0012][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip.
[1378:0012][2018-10-08T14:09:03] Retrying validation for: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip
[1378:000c][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip.

คุณกำลังดูสตรีมการบันทึกของการติดตั้ง Visual Studio ที่ยูทิลิตี้บรรทัดคำสั่งการติดตั้ง Visual Studio กำลังตรวจสอบเวิร์กโหลดที่ติดตั้งทั้งหมด

เวลา 13:26:26 ฉันคลิกภายในหน้าต่างพรอมต์คำสั่ง หน้าจอแสดงผลหยุดพักจนถึง 14:09:03 เมื่อฉันจะกด Enter เพื่อออกจาก "โหมดมาร์ค"

ตอนนี้สังเกตเห็นว่าหลังจาก 13:26:26 กระบวนการเสร็จสิ้นการตรวจสอบแฮช x86-23_r20.zip ข้อความ " สำเร็จ Hash: X " และรีสตาร์ทด้วยไฟล์อื่นที่ 14:09:03 ข้อความ " BEGIN: กำลังตรวจสอบ" [.. ] AndroidSDKPrivateInstall.ps1 "

ในระหว่างการหยุดชั่วคราวยูทิลิตี้การติดตั้ง Visual Studio Setup Command สรุปการตรวจสอบไฟล์ที่กำลังประมวลผลและในเวลาที่จะกลับไปยังคอนโซลควบคุมในเวลานั้นเริ่มการตรวจสอบแฮชใหม่

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