Cara kerja perintah windows ini: echo% path:; = & echo.%

23

Mencari solusi untuk mencetak jalur di dalam pathvariabel di windows Command-Line saya datang ke solusi ini . jawabannya adalah perintah ini:

echo %path:;=&echo.%

sekarang saya bertanya-tanya bagaimana cara kerjanya.

yekanchi
sumber

Jawaban:

22

Itu solusi menarik yang belum pernah saya lihat sebelumnya. Biarkan saya mencoba menjelaskan:

  1. Untuk mencetak seluruh jalur, gunakan echo %path%. Ini akan mencetak semua direktori pada satu baris yang dipisahkan dengan titik koma ( ;)
  2. Untuk mencari / mengganti string dalam suatu variabel, gunakan %path:a=b%yang akan menggantikan semua akarakter denganb
  3. echo. digunakan untuk mencetak baris baru
  4. &digunakan untuk memisahkan perintah, misalnya echo line1&echo line2akan mencetak dua baris
  5. Akibatnya, titik koma di jalur diganti dengan perintah untuk mencetak baris baru. Atau mungkin itu ditafsirkan sebagai 'ganti ;dengan yang tidak ada, lalu cetak baris baru'. Saya tidak dapat menemukan dokumentasi tentang ini, jadi itu hanya interpretasi saya. Terus terang, saya bahkan tidak tahu itu mungkin, tapi begitulah. UPDATE Penafsiran saya tentang langkah ini tampaknya tidak aktif, dan lebih baik dijelaskan oleh wizzwizz4 .
Berend
sumber
untuk apa tanda %% digunakan, tidak bisakah kita memberi tahu echo path? Apakah %% digunakan untuk variabel?
yekanchi
1
Ya, itu benar, itu digunakan untuk mendapatkan nilai variabel. Misalnya: set greeting=Hellolalu echo %greeting%. Secara membingungkan, PATHkebetulan merupakan perintah dan variabel, jadi ketikkan perintah path, atau echo %path%akan memiliki hasil yang sama.
Berend
apa sintaksis ini disebut? apakah itu regex? atau sesuatu yang digunakan di windows CMD saja
yekanchi
Saya tidak yakin apakah ada nama untuk ini, itu hanya cara variabel bekerja di DOS. Bahasa lain, seperti bash, gunakan $PATHmisalnya.
Berend
2
Ini tidak ada hubungannya dengan DOS, Berend; dan echo.bukan "perintah untuk mencetak baris baru". Ini adalah Microsoft command interpreter untuk Windows NT, cmd; dan echo.hanya perintah untuk mencetak elemen path memastikan bahwa jika elemen path kosong itu tidak beralih ke fungsionalitas lainecho . Yang pertama echobenar-benar harus echo.terlalu.
JdeBP
30

Ini menggunakan substitusi variabel baris perintah. %path:;=&echo.%berarti " %path%, tetapi ganti semua ;dengan &echo.". Ini berarti bahwa, dengan set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

menjadi:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

Karena &pemisah perintah, ini setara dengan:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

Karena kebiasaan DOS Batch, echo.identik dengan echo kecuali ketika tidak ada setelahnya. Jika itu masalahnya, ia tidak akan mencetak apa-apa, alih-alih memberi tahu Anda apakah ECHOhidup atau mati. Ini akan menghasilkan:

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

Sungguh, harus echo.%path:;=&echo.%memperhitungkan kasus di mana %PATH%dimulai dengan a ;, tetapi perintah ini cukup pintar pula.


Masuk ke detail detasia, benar echo( - benar harus digunakan sebagai ganti echo.. Ini karena echo.dapat memiliki masalah ketika Anda memiliki file yang dipanggil echo, dan lambat karena harus memeriksa disk ( %CD%dan saya pikir juga semuanya %PATH%) setiap kali dijalankan. (Saya tidak memiliki salinan Windows sehingga saya tidak dapat memeriksanya sendiri; apakah hanya %CD%atau di mana saja di mana %PATH%kehadiran echofile akan mempengaruhi echo., dan apa fungsinya?)

wizzwizz4
sumber
Ini adalah perilaku lama dari penafsir perintah Microsoft / IBM di beberapa sistem operasi, dan tidak spesifik untuk skrip batch. Seperti yang saya catat di superuser.com/a/310157/38062 tahun yang lalu, ada beberapa karakter tanda baca selain spasi putih yang dihitung sebagai karakter terminasi nama-perintah.
JdeBP
@ JdeBP Saya pikir salah satu yang lebih efisien adalah echo), tapi saya tidak begitu ingat. ;-(
wizzwizz4
3
echo.adalah salah satu yang paling banyak beredar orang, bertahun-tahun yang lalu. Ini adalah satu dari banyak buku. Efisiensi bukan masalah. Perilaku aneh ketika berbagai file kebetulan ada adalah. Ketika saya menulis pengganti 32-bit untuk 16-bit cmddi OS / 2, melanggar nama perintah pada karakter tanda baca ini dan perilaku parsing yang sangat tidak teratur ini adalah salah satu hal yang saya sengaja tidak duplikat, dan yang saya letakkan pada dokumen daftar perbedaan. Saya membuat echodotperintah eksternal , yang mana bisa alias echo.sesuai keinginan.
JdeBP
@ JdeBP Kedengarannya sangat menarik! Apakah Anda pikir Anda bisa mendokumentasikan sebagian dari itu ?
wizzwizz4
Jika Anda mengikuti berbagai tautan komentar, Anda berakhir di kloning pesan pihak ketiga yang echo(merupakan satu-satunya versi yang aman.
Neil