Trong Windows Explorer, tại sao chúng ta có thể tạo một thư mục hoặc tệp có ký hiệu phần trăm (%), nếu ký hiệu phần trăm được sử dụng cho các biến hiện có?


13
  1. Tới Windows Explorer, và tạo một thư mục / thư mục có tên %systemdrive%, %windir%hoặc bất kỳ biến khác hiện có.
  2. Mở một dấu nhắc lệnh và đi đến thư mục bạn vừa tạo.

Bạn không thể, vì có %các ký hiệu phần trăm ( ) trong tên thư mục, gây nhầm lẫn cho dấu nhắc lệnh, vì ký hiệu phần trăm được sử dụng cho các biến hiện có.

Thoát %biểu tượng phần trăm ( ) bằng hai ký hiệu phần trăm ( %%) không hoạt động, vì vậy câu trả lời của DavidPostill là sai:

Cửa sổ nhắc lệnh, với một chút màn hình Explorer hiển thị Vậy, trong Windows Explorer, tại sao chúng ta có thể tạo một thư mục hoặc tệp có %ký hiệu phần trăm ( ), nếu ký hiệu phần trăm được sử dụng cho các biến hiện có?

Câu trả lời:


16

Tại sao chúng ta có thể tạo một thư mục / tệp với ký hiệu phần trăm?

%tự không phải là ký tự dành riêng trong tên tệp.

Các ký tự dành riêng để đặt tên tệp, đường dẫn và không gian tên là:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Nguồn đặt tên tệp, đường dẫn và không gian tên


Biểu tượng phần trăm được dành riêng cho các biến

Bây giờ, hãy mở một dấu nhắc lệnh và cố gắng đi đến thư mục bạn đã tạo.

Bạn không thể, bởi vì có các ký hiệu phần trăm trong tên thư mục, chỉ ra rằng đó là một biến.

Những điều trên là không đúng sự thật. Tất cả mọi thứ hoạt động như bạn mong đợi.

Ví dụ sử dụng %test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Ví dụ sử dụng %systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

Phần trăm thoát

%tự có một ý nghĩa đặc biệt cho các tham số và tham số dòng lệnh FOR.

Để coi phần trăm là một nhân vật thông thường, hãy nhân đôi nó:

%%

Cú pháp nguồn


Đọc thêm


1
Lưu ý: không phải tất cả các ký tự dành riêng áp dụng cho hệ thống tệp NTFS. Ví dụ, sử dụng Linux, tôi có thể dễ dàng tạo một tệp có tên <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.
Nathan Osman

2
@NathanOsman Bạn có thể tạo các tệp có các tên đó từ bên trong Windows bằng cách sử dụng ký hiệu đường dẫn tuyệt đối thô ( \\?\C:\USERS\DEFAULT\<test>).
zwol

@zwol ơi? Tôi không biết điều đó. Đó là điều tốt để biết.
Nathan Osman

@zwol Không phải từ cmdshell ... F:\test>md \\?\f:\test\<test> Cú pháp của lệnh không chính xác.
DavidPostill

@DavidPostill Còn gì md \\^?\f:\test\^<test^>?
zwol

11

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


Tại sao bạn sử dụng thẻ bàn phím cho tên đường dẫn / lệnh? Nó sẽ vừa chính xác hơn về mặt cú pháp và dễ đọc hơn nếu bạn vừa sử dụng định dạng mã nội tuyến. Nó cũng sẽ dễ dàng hơn để gõ: một backtick thay vì <kbd>.
Cody Grey

làm xong. Tôi nghĩ rằng các thẻ <kbd> </ kbd> có đường viền rõ ràng hơn nhiều code blocks. Nhưng nếu một câu hỏi như vậy phát sinh, tôi đoán họ gây ra nhầm lẫn.
Jack White

2
"Đó là một biểu tượng thoát của vỏ lệnh" Không đúng. Nhân vật thoát trong cmd là ^. %là "một ký tự có ý nghĩa đặc biệt đối với các tham số dòng lệnh và tham số FOR. Để coi phần trăm là ký tự thông thường, hãy nhân đôi nó".
DavidPostill

Thật vậy, tôi đã có các điều khoản lẫn lộn. Bây giờ sửa câu trả lời. Cảm ơn.
Jack White

Cũng xin lưu ý, như được nêu trong câu trả lời của tôi, bạn chỉ đôi %trong fornếu đó forlà bên trong một tập tin thực thi. Nhập for %%i in (*) do echo %%ivào một cửa sổ propmt lệnh tạo ra một lỗi trích dẫn xuất hiện không phù hợp %%i.
Jack White
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.