Apa fungsinya jika saya klik di jendela cmd?

45

Misalkan saya menjalankan cmd.exe dan ping localhost. Setelah itu saya ping localhost lagi tapi saya klik ke jendela dan ping berhenti sampai saya tekan enter .

Apa yang terjadi tepat ketika saya mengklik ke jendela? Apakah itu menunda proses atau sesuatu yang lain? Saya melampirkan tangkapan layar untuk mengklarifikasi masalah ini.

Catatan: Saya tidak benar-benar mengklik tetapi menyeret menggunakan mouse yang menciptakan kotak putih di jendela seperti yang Anda lihat pada tangkapan layar.

Sunting: klarifikasi lebih lanjut: Yang benar-benar ingin saya ketahui adalah apakah menyeret jendela menghentikan proses cmd atau tidak?

Sunting: bahkan lebih banyak klarifikasi: Saya tahu saya menggunakan Edit Cepat dan menekan enter menyalin isi yang saya pilih. Yang tidak saya ketahui adalah apa yang terjadi di latar belakang.

masukkan deskripsi gambar di sini

Adam Arold
sumber
2
BTW, Anda dapat memberikan suara pada UserVoice untuk mengubah perilaku ini: wpdev.uservoice.com/forums/…
Carl Walsh
Bagus. Saya memilih itu.
Adam Arold
Voting hanya membawa saya ke halaman 404
Kelly Bang
1
Dan yang lebih penting di sini adalah cara mematikan fitur mengerikan dewa ini dari stackoverflow.com/a/37578608/463967
Alan Macdonald

Jawaban:

27

Ketika Anda memilih beberapa teks di jendela cmd.exe, proses akan melanjutkan di latar belakang sampai waktu berikutnya ia menulis ke Output Standar (atau STDOUT, aliran data yang ditampilkan di jendela cmd.exe).

Ketika Anda keluar dari mode pemilihan, proses akan dilanjutkan seperti biasa.

Anda dapat menguji ini dengan mengetikkan ping www.google.com -tke jendela cmd.exe Anda, dan memilih area keluaran. Anda akan melihatnya berhenti, dan ketika Anda membatalkan pilihan, output akan dilanjutkan.

Sunting: Sesuai komentar Fran, Anda dapat menggunakan alat seperti Wireshark untuk melihat bahwa aktivitas masih terjadi setelah titik ketika Anda membuat pilihan, dan kemudian berhenti.

JohnL
sumber
3
Itu saja tidak mengujinya. Anda juga perlu menjalankan Wireshark dan melihat apakah paket ICMP berhenti dikirim. Jika demikian, Anda benar bahwa prosesnya ditangguhkan. Jika tidak, prosesnya tidak ditangguhkan, dan output hanya mendapat buffered (sampai buffer terisi, maka buffer akan ditangguhkan atau data akan hilang).
Fran
1
Saya cukup yakin @ Fran benar - bukankah sejumlah besar output muncul sekaligus, jika Anda menunggu cukup lama dalam mode pemilihan?
Izkata
1
Ini sangat mengganggu saya, tetapi saya menemukan bahwa jika Anda pergi ke properti windows cmd Anda dapat membatalkan pilihan "Mode edit cepat" dan Anda tidak akan masuk ke mode pilih dengan mengklik di jendela.
Zitrax
2
@Zitrax ya begitulah cara Anda mencegah hal ini terjadi tanpa sengaja. Saya sering menyalin sesuatu dari jendela perintah saya, jadi saya tidak melakukan itu. (well, sebenarnya saya menggunakan Consolez yang tidak memiliki masalah itu)
JohnL
1
Ini disebut " memblokir " ... yaitu: panggilan aplikasi write()tetapi macet.
Attie
50

Setelah Anda mengklik ke jendela Command Prompt, host konsol tidak akan lagi mengizinkan keluaran ditulis. Aplikasi itu sendiri terus berjalan, tetapi tidak ada yang tertulis di layar.

Tentu saja, selama hanya ada satu utas, ini pada dasarnya adalah hal yang sama dengan proses Anda dibekukan. Sebagai utas tunggal mencoba untuk menulis beberapa output sebelum melakukan lebih banyak pekerjaan.

Jika saya menjalankan ping -t localhostdan mengklik ke jendela prompt perintah, saya kemudian dapat memeriksa tumpukan panggilan dari ping.exeutas utama dengan Process Explorer .

masukkan deskripsi gambar di sini

Kita dapat melihat bahwa ping.exemencoba untuk menulis beberapa keluaran. Disebut write()dalam pustaka runtime C. Fungsi itu, pada titik tertentu, memanggil GetConsoleMode . Sepertinya, fungsi itu akan memeriksa apakah pengguna saat ini dalam mode tandai dan memblokir eksekusi jika diperlukan.

Analisis lebih lanjut

Kami selanjutnya dapat membuktikan perilaku ini dengan memeriksa perilaku pingdengan Wireshark

Saat menjalankan, ping -t superuser.comkami melihat output berikut di Wireshark:
masukkan deskripsi gambar di sini

Sekarang, mari tandai kotak di command prompt.
masukkan deskripsi gambar di sini
Tiba-tiba, tidak ada lagi ping yang masuk di Wireshark. pingtidak lagi mengirim paket apa pun.

Tapi kami sudah tahu itu...

Benar, mari kita lihat apakah outputnya benar - benar masalah di sini! Mari kita mengarahkan output ke NULperangkat:

masukkan deskripsi gambar di sini

Sekarang, tidak ada lagi ouput. Kami sekarang dapat menandai teks di dalam kotak sepanjang hari, paket akan login di Wireshark.

masukkan deskripsi gambar di sini

Der Hochstapler
sumber
Jika saya belum memberi +1 untuk jawaban semula, saya akan memberi +1 sekarang untuk "Analisis lebih lanjut"
JohnL
6

Itu karena jendela telah memasuki mode Mark. Ketika Anda menekan enter, itu menyalin teks yang dipilih ke clipboard. Sepengetahuan saya, tidak ada pengaturan untuk ini, jadi saya tidak yakin mengapa melakukan itu ketika Anda cukup mengklik ke jendela. Biasanya Anda harus mengklik kanan dan menekan "Tandai". Periksa untuk memastikan tidak ada tombol yang tersangkut di keyboard Anda.

Brandon J. Dusseau
sumber
Dan apa yang dilakukan "Mark mode"? Apakah itu menunda proses?
Adam Arold
Mode Markus digunakan untuk menyalin teks dari jendela perintah. AFAIK itu satu-satunya penggunaan, meskipun saya kira mungkin ada yang lain.
Garrett
7
Pengaturan ini disebut Mode Edit Cepat. Klik ikon di sudut kiri atas, pilih Properties dan Pilih Mode Edit Cepat pada tab Opsi. Dari apa yang saya tahu, proses akan berlanjut di latar belakang sampai perlu berinteraksi dengan konsol, di mana titik itu akan diblokir
JohnL
@JohnL tolong buat jawaban karena komentar Anda adalah yang saya cari.
Adam Arold
@edem Menambahkan jawaban :)
JohnL
6

Jendela CMD Anda dalam mode edit cepat yang secara otomatis memasuki mode edit ketika Anda mengklik layar. Enter adalah untuk menyalin teks di kotak putih dan keluar dari mode edit.

Biasanya CMD hanya memasuki mode edit ketika Anda mengklik kanan pada layar hitam dan memilih Tandai.

Untuk mengubah kembali ke normal, klik kanan pada bilah judul jendela dan pilih Properti, pilih tab Opsi dan hapus pilihan "Mode Edit Cepat" dan klik ok.

Nam Phung
sumber
3

Ketika Anda memilih teks untuk disalin dari jendela (ketika di Mark mode) sistem menunda proses saat ini di jendela itu.

Contoh file batch:

:test
echo %0
goto test

ketika ini dijalankan, segera setelah saya menandai area yang akan disalin, layar berhenti bergulir

SeanC
sumber
Saya hendak memposting hal yang sama persis (kecuali file batch saya echo blah↵%0). :-)
Synetech
1

Karena setiap orang telah dengan baik menunjukkan kemajuan dari output tambahan diblokir saat operasi tanda sedang berlangsung. Selain itu, baik menggunakan klik-alternatif tetikus (klik kanan secara default) atau dengan menekan tombol Enter pada keyboard Anda, Anda dapat keluar dari mode Tandai dan menyalin pilihan yang ditandai ke buffer tempel Windows. Ada jalan keluar lain dan itu adalah dengan menekan tombol Esc untuk meninggalkan menandai area layar dan melepaskan blok pada output. Ini mengasumsikan bahwa Anda memiliki mode QuickEdit yang dipilih di properti jendela perintah itu. Anda juga dapat masuk ke situasi ini dengan lebih sengaja dengan memberi tahu jendela perintah bahwa Anda ingin memilih beberapa teks.

Hari H
sumber
0

Untuk lebih menguatkan pernyataan bahwa proses berhenti dalam "Mark mode", misalnya selama klik mouse atau seret di dalam batas jendela cmd.exe, tetapi menghentikan operasi apa pun hanya setelah benar-benar selesai dengan instance yang sedang berlangsung, saya menawarkan bukti tidak langsung:

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

Anda sedang melihat aliran logging instalasi Visual Studio di mana Visual Studio Setup Command Line Utility memverifikasi semua beban kerja yang diinstal.

Pada 13:26:26 saya mengklik bagian dalam jendela Command Prompt. Output to screen terhenti hingga 14:09:03 ketika saya menekan Enter untuk keluar dari "Mark mode".

Sekarang perhatikan bahwa setelah 13:26:26, proses selesai untuk memeriksa hash x86-23_r20.zip, pesan " berhasil. Hash: X " dan mulai kembali dengan file lain pada 14:09:03, pesan " BEGIN: Memverifikasi" [..] AndroidSDKPrivateInstall.ps1 "

Selama jeda Visual Studio Setup Command Line Utility menyelesaikan verifikasi file yang sedang diproses, dan tepat pada saat kontrol akan dikembalikan ke konsol, memulai pekerjaan pemeriksaan hash baru.

pin8all
sumber