Nó làm gì chính xác nếu tôi nhấp vào cửa sổ của cmd?


45

Giả sử tôi chạy cmd.exe và ping localhost. Sau đó tôi ping localhost lần nữa nhưng tôi bấm vào cửa sổ và ping dừng lại cho đến khi tôi nhấn enter .

Điều gì xảy ra chính xác khi tôi nhấp vào cửa sổ? Liệu nó đình chỉ quá trình hay cái gì khác? Tôi đính kèm một ảnh chụp màn hình để làm rõ vấn đề này.

Lưu ý: Tôi không thực sự nhấp nhưng kéo bằng chuột tạo hộp trắng trong cửa sổ như bạn có thể thấy trên ảnh chụp màn hình.

Chỉnh sửa: làm rõ thêm: Điều tôi thực sự muốn biết là liệu việc kéo cửa sổ có làm dừng quá trình cmd hay không?

Chỉnh sửa: thậm chí làm rõ hơn: Tôi biết rằng tôi đang sử dụng Chỉnh sửa nhanh và nhấn nhập bản sao nội dung tôi đã chọn. Những gì tôi không biết là những gì xảy ra trong nền.

nhập mô tả hình ảnh ở đây


2
BTW, bạn có thể bỏ phiếu trên UserVoice để thay đổi hành vi này: wpdev.uservoice.com/forums/ mẹo
Carl Walsh

Tốt đẹp. Tôi đã bỏ phiếu cho nó.
Adam Arold

Bỏ phiếu chỉ là đưa tôi đến một trang 404
Kelly Bang

1
Và quan trọng hơn đây là cách tắt tính năng khủng khiếp của vị thần này khỏi stackoverflow.com/a/37578608/463967
Alan Macdonald

Câu trả lời:


27

Khi bạn chọn một số văn bản trong cửa sổ cmd.exe, quá trình sẽ tiếp tục ở chế độ nền cho đến lần tiếp theo ghi vào Đầu ra tiêu chuẩn (hoặc STDOUT, luồng dữ liệu được hiển thị trong cửa sổ cmd.exe).

Khi bạn thoát khỏi chế độ lựa chọn, quá trình sẽ tiếp tục như bình thường.

Bạn có thể kiểm tra điều này bằng cách nhập ping www.google.com -tvào cửa sổ cmd.exe của bạn và chọn một số khu vực của đầu ra. Bạn sẽ thấy nó tạm dừng và khi bạn bỏ chọn đầu ra sẽ tiếp tục.

Chỉnh sửa: Theo nhận xét của Fran, bạn có thể sử dụng một công cụ như Wireshark để xem hoạt động đó vẫn xảy ra sau thời điểm bạn thực hiện lựa chọn và sau đó dừng lại.


3
Điều đó một mình không kiểm tra nó. Bạn cũng cần chạy Wireshark và xem các gói ICMP có ngừng được gửi không. Nếu vậy, bạn đúng rằng quá trình bị đình chỉ. Nếu không, quá trình không bị đình chỉ và đầu ra chỉ đơn giản là được đệm (cho đến khi bộ đệm lấp đầy, thì nó sẽ bị treo hoặc dữ liệu sẽ bị mất).
Fran

1
Tôi khá chắc chắn @Fran đã đúng - không phải toàn bộ đầu ra xuất hiện cùng một lúc, nếu bạn đợi đủ lâu trong chế độ lựa chọn?
Izkata

1
Điều này làm tôi bực mình rất nhiều, nhưng tôi phát hiện ra rằng nếu bạn vào thuộc tính của các cửa sổ cmd, bạn có thể bỏ chọn "Chế độ chỉnh sửa nhanh" và bạn sẽ không vào chế độ chọn bằng cách nhấp vào cửa sổ.
Zitrax

2
@Zitrax có, đó là cách bạn có thể ngăn chặn điều này xảy ra một cách tình cờ. Tôi thường xuyên sao chép mọi thứ từ cửa sổ lệnh của mình, vì vậy tôi không làm điều đó. (tốt, thực ra tôi sử dụng Consolez không có vấn đề đó)
JohnL

1
Điều này được gọi là " chặn " ... tức là: ứng dụng gọi write()nhưng nó bị kẹt.
Attie

50

Khi bạn nhấp vào cửa sổ Dấu nhắc Lệnh, máy chủ bảng điều khiển sẽ không còn cho phép đầu ra được ghi. Ứng dụng tiếp tục chạy, nhưng không có gì được ghi lên màn hình.

Tất nhiên, miễn là chỉ có một luồng duy nhất, điều này về cơ bản giống như quá trình của bạn bị đóng băng. Khi chủ đề duy nhất cố gắng viết một số đầu ra trước khi thực hiện nhiều công việc hơn.

Nếu tôi chạy ping -t localhostvà bấm vào cửa sổ nhắc lệnh, thì tôi có thể kiểm tra ngăn xếp cuộc gọi của ping.exeluồng chính bằng Process Explorer .

nhập mô tả hình ảnh ở đây

Chúng ta có thể thấy rằng ping.exeđã cố gắng để viết một số đầu ra. Nó được gọi write()trong thư viện thời gian chạy C. Hàm đó, tại một số điểm, gọi GetConsoleMode . Có vẻ như, chức năng đó sẽ kiểm tra xem người dùng hiện đang ở chế độ đánh dấu và chặn thực thi nếu cần.

Phân tích sâu hơn

Chúng tôi có thể chứng minh thêm hành vi này bằng cách kiểm tra hành vi của pingvới Wireshark

Khi chạy, ping -t superuser.comchúng ta thấy đầu ra sau trong Wireshark:
nhập mô tả hình ảnh ở đây

Bây giờ, hãy đánh dấu một hộp trong dấu nhắc lệnh.
nhập mô tả hình ảnh ở đây
Đột nhiên, không có thêm ping nào được đăng nhập vào Wireshark. pingkhông còn gửi bất kỳ gói tin.

Nhưng chúng ta đã biết rằng...

Phải, hãy xem đầu ra có thực sự là vấn đề ở đây không! Hãy hướng đầu ra cho NULthiết bị:

nhập mô tả hình ảnh ở đây

Bây giờ, không còn bất kỳ ouput. Bây giờ chúng ta có thể đánh dấu văn bản trong hộp cả ngày, các gói sẽ được đăng nhập vào Wireshark.

nhập mô tả hình ảnh ở đây


Nếu tôi chưa có 1 câu trả lời ban đầu, tôi sẽ +1 ngay bây giờ cho "Phân tích thêm"
JohnL

6

Đó là bởi vì cửa sổ đã vào chế độ Mark. Khi bạn nhấn enter, nó sẽ sao chép văn bản đã chọn vào bảng tạm. Theo hiểu biết của tôi, không có cài đặt nào cho việc này, vì vậy tôi không chắc tại sao nó lại làm như vậy khi bạn chỉ cần nhấp vào cửa sổ. Thông thường bạn phải nhấp chuột phải và nhấn "Đánh dấu". Kiểm tra để đảm bảo không có phím nào bị kẹt trên bàn phím của bạn.


Và "Chế độ đánh dấu" làm gì? Liệu nó đình chỉ quá trình?
Adam Arold

Chế độ đánh dấu được sử dụng để sao chép văn bản từ cửa sổ lệnh. AFAIK là sử dụng duy nhất, mặc dù tôi cho rằng có thể có những người khác.
Garrett

7
Cài đặt được gọi là Chế độ chỉnh sửa nhanh. Nhấp vào biểu tượng ở góc trên cùng bên trái, chọn Thuộc tính và Chọn Chế độ chỉnh sửa nhanh trên tab Tùy chọn. Từ những gì tôi biết, quá trình sẽ tiếp tục ở chế độ nền cho đến khi cần tương tác với bảng điều khiển, tại thời điểm đó, nó sẽ chặn
JohnL

@JohnL vui lòng tạo câu trả lời vì nhận xét của bạn là những gì tôi đang tìm kiếm.
Adam Arold

@edem Đã thêm câu trả lời :)
JohnL

6

Cửa sổ CMD của bạn ở chế độ chỉnh sửa nhanh, tự động vào chế độ chỉnh sửa khi bạn nhấp vào màn hình. Enter là để sao chép văn bản trong hộp trắng và thoát khỏi chế độ chỉnh sửa.

Thông thường CMD chỉ vào chế độ chỉnh sửa khi bạn nhấp chuột phải vào màn hình đen và chọn Đánh dấu.

Để thay đổi trở lại bình thường, nhấp chuột phải vào thanh tiêu đề của các cửa sổ và chọn Thuộc tính, chọn tab Tùy chọn và bỏ chọn "Chế độ chỉnh sửa nhanh" và nhấp vào ok.


3

Khi bạn chọn văn bản để sao chép từ cửa sổ (khi ở Markchế độ), hệ thống sẽ tạm dừng quy trình hiện tại trong cửa sổ đó.

Ví dụ tệp bó:

:test
echo %0
goto test

Khi điều này được chạy, ngay khi tôi đánh dấu khu vực cần sao chép, màn hình sẽ ngừng cuộn


Tôi đã định đăng chính xác điều tương tự (ngoại trừ tệp bó của tôi echo blah↵%0). :-)
Synetech

1

Như mọi người đã chỉ ra một cách độc đáo quá trình đầu ra bổ sung bị chặn trong khi một hoạt động đánh dấu đang được tiến hành. Ngoài ra, bằng cách sử dụng nhấp chuột thay thế (nhấp chuột phải theo mặc định) hoặc bằng cách nhấn phím Enter trên bàn phím, bạn có thể thoát chế độ Đánh dấu và sao chép lựa chọn được đánh dấu vào bộ đệm dán của Windows. Có một lối thoát khác và đó là nhấn phím Esc để từ bỏ đánh dấu một khu vực màn hình và giải phóng khối trên đầu ra. Điều này giả định rằng bạn có chế độ QuickEdit được chọn trong thuộc tính của cửa sổ lệnh đó. Bạn cũng có thể vào tình huống này một cách có chủ ý hơn bằng cách nói với cửa sổ lệnh rằng bạn muốn chọn một số văn bản.


0

Để tiếp tục chứng thực tuyên bố rằng quá trình tạm dừng trong "Chế độ đánh dấu", ví dụ: trong khi nhấp chuột hoặc kéo bên trong viền cửa sổ cmd.exe, nhưng tạm dừng bất kỳ thao tác nào sau khi hoàn thành với ví dụ đang diễn ra, tôi đưa ra một bằng chứng gián tiếp:

[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.

Bạn đang xem luồng ghi nhật ký của bản cài đặt Visual Studio nơi Tiện ích dòng lệnh thiết lập Visual Studio đang xác minh tất cả các khối lượng công việc đã cài đặt.

Lúc 13:26:26 tôi bấm vào bên trong cửa sổ Dấu nhắc Lệnh. Đầu ra màn hình tạm dừng đến 14:09:03 khi tôi sẽ nhấn Enter để thoát "Chế độ đánh dấu".

Bây giờ hãy lưu ý rằng sau 13:26:26, quá trình kết thúc để kiểm tra băm x86-23_r20.zip, thông báo " đã thành công. Hash: X " và khởi động lại với một tệp khác vào lúc 14:09:03, thông báo " BEGIN: Verifying" [..] AndroidSDKPrivateInstall.ps1 "

Trong quá trình tạm dừng, Visual Studio Setup Command Line Utility đã kết luận xác minh tệp đang xử lý và tại thời điểm chính xác khi điều khiển được đưa trở lại bàn điều khiển, bắt đầu công việc kiểm tra băm mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.