Cách lệnh windows này hoạt động: echo% path:; = & echo.%


Câu trả lời:


22

Đó là một giải pháp thú vị mà tôi chưa từng thấy trước đây. Hãy để tôi cố gắng giải thích:

  1. Để in toàn bộ đường dẫn, sử dụng echo %path%. Điều này sẽ in tất cả các thư mục trên một dòng được phân tách bằng dấu chấm phẩy ( ;)
  2. Để tìm kiếm / thay thế một chuỗi trong một biến, hãy sử dụng %path:a=b%nó sẽ thay thế tất cả các aký tự bằngb
  3. echo. được sử dụng để in một dòng mới
  4. &được sử dụng để phân tách các lệnh, ví dụ như echo line1&echo line2sẽ in hai dòng
  5. Trong thực tế, dấu chấm phẩy trong đường dẫn được thay thế bằng một lệnh để in một dòng mới. Hoặc có thể nó được hiểu là "thay thế ;bằng không có gì, và sau đó , in một dòng mới". Tôi không thể tìm thấy bất kỳ tài liệu nào về điều này, vì vậy đó chỉ là cách giải thích của tôi. Thành thật mà nói, tôi thậm chí không biết điều đó là có thể, nhưng bạn đã đi. CẬP NHẬT Giải thích của tôi về bước này dường như bị tắt, và được giải thích tốt hơn bởi wizzwizz4 .

Dấu hiệu %% được sử dụng để làm gì, chúng ta có thể nói echo pathkhông? %% được sử dụng cho các biến?
yekanchi

1
Vâng, đó là chính xác, những người được sử dụng để có được giá trị của một biến. Ví dụ: set greeting=Hellovà sau đó echo %greeting%. Một cách khó hiểu, PATHtình cờ là cả một lệnh và một biến, do đó, gõ lệnh path, hoặc echo %path%sẽ có kết quả tương tự.
Berend

cú pháp này được gọi là gì? có phải là regex không? hoặc một cái gì đó chỉ được sử dụng trong windows CMD
yekanchi

Tôi không chắc có tên nào cho việc này không, đó chỉ là cách các biến hoạt động trong DOS. Các ngôn ngữ khác, chẳng hạn như bash, sử dụng $PATHví dụ.
Berend

2
Điều này không có gì để làm với DOS, Berend; và echo.không phải là "lệnh in một dòng mới". Đây là trình thông dịch lệnh của Microsoft cho Windows NT , cmd; và echo.chỉ đơn giản là lệnh in một phần tử đường dẫn đảm bảo rằng nếu phần tử đường dẫn trống thì nó không chuyển sang chức năng khácecho . Đầu tiên echothực sự nên là một echo.quá.
JdeBP

30

Đây là sử dụng thay thế biến dòng lệnh. %path:;=&echo.%có nghĩa là " %path%, nhưng thay thế tất cả ;s bằng &echo.". Điều này có nghĩa là, với set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

trở thành:

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

&là một dấu phân cách lệnh, điều này tương đương với:

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

Do sự kỳ quặc của DOS Batch, echo.giống hệt như echo ngoại trừ khi không có gì sau nó. Nếu đó là trường hợp, nó chỉ đơn giản là in không có gì, thay vì cho bạn biết ECHOlà bật hay tắt. Điều này sẽ làm cho đầu ra:

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

C:\Python37

C:\Users\wizzwizz4> 

Thực sự, nó nên được echo.%path:;=&echo.%tính cho trường hợp %PATH%bắt đầu bằng một ;, nhưng dù sao lệnh này cũng khá thông minh.


Bắt đầu vào chi tiết, thực sự echo( nên được sử dụng thay vì echo.. Điều này là do echo.có thể có vấn đề khi bạn có một tệp được gọi echovà chậm vì nó phải kiểm tra đĩa ( %CD%và tôi cũng nghĩ là tất cả %PATH%) mỗi khi nó chạy. (Tôi không có bản sao Windows nên tôi không thể tự kiểm tra; nó chỉ %CD%hoặc bất cứ nơi nào %PATH%mà sự hiện diện của echotệp sẽ ảnh hưởng echo.và nó làm gì?)


Đây là hành vi lâu đời của các trình thông dịch lệnh của Microsoft / IBM trên một số hệ điều hành và không dành riêng cho các tập lệnh bó. Như tôi đã lưu ý tại superuser.com/a/310157/38062 năm trước, có một số ký tự dấu chấm câu ngoài khoảng trắng được tính là ký tự kết thúc tên lệnh.
JdeBP

@JdeBP Tôi nghĩ một trong những cách hiệu quả hơn là echo), nhưng tôi không thực sự nhớ. ;-(
wizzwizz4

3
echo.là thứ mà mọi người thường lưu hành nhiều năm trước. Nó là một trong nhiều cuốn sách. Hiệu quả không phải là vấn đề. Hành vi lập dị khi các tập tin khác nhau tồn tại là. Khi tôi viết thay thế 32 bit cho 16 bit cmdtrong OS / 2, việc ngắt tên lệnh tại các ký tự dấu chấm câu này và hành vi phân tích cú pháp không đều này là một trong những điều mà tôi cố tình không sao chép và tôi đã đưa vào tài liệu danh sách sự khác biệt. Tôi đã thực hiện một echodotlệnh bên ngoài thay vào đó, mà người ta có thể bí danh echo.như mong muốn.
JdeBP

@JdeBP Nghe có vẻ rất thú vị! Bạn có nghĩ rằng bạn có thể ghi lại một số điều đó ?
wizzwizz4

Nếu bạn theo các liên kết bình luận khác nhau, bạn sẽ nhận được thông báo trên diễn đàn của bên thứ ba echo(là phiên bản an toàn duy nhất.
Neil
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.