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.exe
và 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.bat
và 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 for
trong 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 for
lệ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à %%i
có ý 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 %%i
mà không dùng đến %p%
cách giải quyết được mô tả trong phần tiếp theo ( %%%%i
khô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 for
lệ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 for
lệ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.