Câu trả lời của DavidPostill là tuyệt vời, nhưng có thể gây nhầm lẫn cho người mới một chút. Tôi sẽ cố gắng viết lại.
%không phải là một nhân vật dành riêng .
Nó là một nhân vật có ý nghĩa đặc biệt với shell lệnh (aka cmd.exevà command.com)
Sự khác biệt là:
- bạn hoàn toàn không thể sử dụng các ký tự dành riêng (nhưng xem bên dưới)
- bạn có thể sử dụng các ký tự đặc biệt và thoát - chỉ bằng cách nhập chúng như là
Nói cách khác, bạn có thể tạo một tệp hoặc thư mục chứa %tên của họ. Bạn có thể làm điều đó trực tiếp bằng windows explorer vì %không có ý nghĩa đặc biệt nào ở đó. Không có ý định ngăn bạn tạo các tệp như vậy tại dấu nhắc lệnh, nhưng vì %có ý nghĩa đặc biệt ở đó, bạn cần sử dụng cú pháp được nêu dưới đây để tạo các tệp như vậy.
BAT-file
Nếu bạn đang viết một tệp bó (* .bat, * .cmd), được thực thi bởi shell lệnh (hay còn gọi là ứng dụng nhắc lệnh), hãy sử dụng theo %nghĩa đen (chẳng hạn như để tạo tệp có %tên và không thay thế một biến hoặc tham số) bạn cần gõ %%thay thế.
Ví dụ,
- lệnh
echo %windir%tạo đầu ra:c:\windows
- tuy nhiên, lệnh
echo %%windir%%tạo đầu ra:%windir%
- và như vậy: lệnh
echo %%%%windir%%%%tạo đầu ra:%%windir%%
Vì vậy, nếu bạn lưu dòng sau dưới dạng test.batvà chạy nó, nó sẽ tạo một thư mục có tên %test%hoàn chỉnh với các dấu phần trăm:
md %%test%%
Nếu không có biến được đặt tên test, lệnh tiếp theo này tương đương với lệnh cuối cùng - nó cũng tạo một thư mục %test%:
md %test%
... nhưng xin đừng bao giờ làm như vậy vì lệnh của bạn sẽ không hành xử theo cách bạn muốn một khi ai đó tạo một biến có tên đó
Nếu bạn có ý định sử dụng lệnh fortrong tệp BAT, bạn cũng cần phải tăng gấp đôi %để nó có ý nghĩa đặc biệt đối với forlệnh thay vì cho chính vỏ lệnh:
for %%i in (*.*) do echo %%i
Điều này sẽ tạo ra một danh sách các tệp trong thư mục hiện tại (nghĩa là %%icó ý nghĩa đặc biệt) và tôi không chắc làm thế nào để tạo ra nó theo nghĩa đen %%imà không dùng đến %p%cách giải quyết được mô tả trong phần tiếp theo ( %%%%ikhông hoạt động ở đây).
%không phải là ký tự duy nhất có ý nghĩa đặc biệt tại dấu nhắc lệnh. Những người khác bao gồm ^, <, >, |, (, ), &, !, ". Hầu hết những cái đó (không bao gồm ") có thể được thoát - nghĩa là, có tiền tố với một ký tự thoát ^để một ký tự nghĩa đen được chèn vào, triệt tiêu ý nghĩa đặc biệt của nó. Những người này cũng mất chức năng đặc biệt của họ bên trong chuỗi doublequote và "được thoát bằng dấu gạch chéo ngược : \". Một số dấu mũ ( ^) có thể cần phải được nhân đôi trong chuỗi bao kép và khi diễn ra sự thay thế biến bị trì hoãn ( !ý nghĩa đặc biệt).
Dấu nhắc lệnh
Thật không may, khi gõ lệnh trực tiếp vào cửa sổ nhắc lệnh, nhân đôi %nhân vật chỉ tạo ra %%tức là cách tiếp cận trên không hoạt động trong trường hợp đó.
Dường như có một cách giải quyết khai thác một cách giải quyết trong xử lý lệnh - bạn có thể nhận được %bằng chữ bằng cách gõ ^sau %. Cách tiếp cận đó không phải là hoàn hảo: nếu tên tệp của bạn được đặt trong dấu ngoặc kép, ^được hiểu theo nghĩa đen (và không bị xóa như không có dấu ngoặc kép)
- lệnh
echo %windir%tạo đầu ra:c:\windows
- lệnh
echo %^windir%tạo đầu ra:%windir%
- lệnh
echo "%^windir%"tạo đầu ra: "%^windir%"(có thêm ^- không phải những gì chúng ta muốn)
Tôi đề nghị một cách giải quyết khác thay thế:
- tạo một biến như thế này:
set "p=%"
- sử dụng
%p%bất cứ nơi nào bạn cần một ký hiệu phần trăm theo nghĩa đen: echo "%p%windir%p%"bây giờ sẽ tạo đầu ra:"%windir%"
Cách giải quyết tương tự có thể được sử dụng để nhận forlệnh đăng nhập phần trăm theo nghĩa đen , tuy nhiên lưu ý rằng không giống như các tệp BAT khi nhập forlệnh trực tiếp, bạn không nhân đôi dấu phần trăm.
Hệ thống tập tin nhân vật dành riêng
Thông thường bạn không thể tạo một tệp hoặc thư mục chứa các ký tự dành riêng sau trong tên của nó : / ? < > \ : * | ", ký hiệu NULL và các ký tự có mã từ 1 đến 31; cũng .và không gian không thể là ký tự cuối cùng; và tên sau đây là bất hợp pháp : com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.
Tuy nhiên, một số hạn chế này có thể được bỏ qua đường dẫn tệp tiền tố \\?\như thế này : \\?\c:\test...\nul. Ít nhất các tệp có tên dành riêng và những người kết thúc bằng dấu cách và dấu chấm có thể được thao tác theo cách đó.
Hơn nữa, hệ thống tập tin NTFS tự hỗ trợ một số hệ thống con đặt tên: DOS, Windows và POSIX. Đây là hệ thống con Windows có tất cả các hạn chế ở trên, trong khi POSIX chỉ cấm /và ký hiệu NULL.
Do đó, GNU / Linux OS (siêu bộ POSIX) có thể tạo (và xóa) tên tệp / thư mục mà hầu hết các hàm API bình thường (và do đó các chương trình windows) không thể hoạt động. Trên Windows XP có thể làm việc với chúng bằng cách cài đặt "Dịch vụ cho hệ thống con Unix" (SFU) miễn phí; trên Vista và các công cụ của bên thứ ba trở lên là bắt buộc. Tôi không chắc hệ thống con ubfox-on-windows10 mới có làm được không.
<test>. Đơn giản là không thể thực hiện được bằng các chức năng quản lý tệp của Windows.