태그 보관물: ms-dos

ms-dos

Windows 탐색기에서 백분율 기호가 기존 변수에 사용되는 경우 백분율 (%) 기호로 폴더 나 파일을 만들 수있는 이유는 무엇입니까? 만든 폴더로

  1. Windows 탐색기로 이동라는 이름의 폴더 / 디렉토리 생성 %systemdrive%, %windir%또는 기존의 다른 변수를.
  2. 명령 프롬프트를 열고 방금 만든 폴더로 이동하십시오.

%백분율 기호는 기존 변수에 사용되므로 폴더 이름에 백분율 ( ) 기호가 있기 때문에 명령 프롬프트를 혼동 할 수 없습니다 .

백분율 ( %) 기호를 두 백분율 기호 ( %%)로 이스케이프하면 작동하지 않으므로 DavidPostill의 답변이 잘못되었습니다.

약간의 Explorer 데스크탑이 표시된 명령 프롬프트 창
따라서 Windows 탐색기 %에서 백분율 기호가 기존 변수에 사용되는 경우 백분율 ( ) 기호 로 폴더 나 파일을 만들 수있는 이유는 무엇입니까?



답변

퍼센트 기호로 폴더 / 파일을 만들 수있는 이유는 무엇입니까?

%문자는 파일 이름에 예약 된 문자가 아닙니다.

파일, 경로 및 네임 스페이스 이름 지정을 위해 예약 된 문자는 다음과 같습니다.

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

소스 이름 지정 파일, 경로 및 네임 스페이스


퍼센트 기호는 변수를 위해 예약되어 있습니다

이제 명령 프롬프트를 열고 작성한 폴더로 이동하십시오.

폴더 이름에 백분율 기호가있어서 변수임을 나타내는 것은 불가능합니다.

위의 사실이 아닙니다. 모든 것이 예상대로 작동합니다.

사용 예 %test%:

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

사용 예 %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

탈출 퍼센트

%문자는 명령 줄 매개 변수와의 특별한 의미가 FOR매개 변수를.

퍼센트를 일반 문자로 취급하려면 두 배로 늘리십시오.

%%

소스 구문


추가 자료


답변

DavidPostill의 답변은 훌륭하지만 새로 온 사람들을 약간 혼란스럽게 할 수 있습니다. 나는 문구를 바꾸려고 노력할 것이다.

%예약 된 문자 가 아닙니다 .

명령 셸에 특별한 의미 를 가진 문자입니다 (일명 and ).cmd.execommand.com

차이점은 다음과 같습니다.

  • 예약 문자를 전혀 사용할 수 없습니다 (하지만 아래 참조).
  • 특수 문자와 이스케이프 문자를 그대로 사용할 수 있습니다.

즉, %이름에 포함 된 파일 또는 폴더를 만들 수 있습니다 . %특별한 의미가 없기 때문에 Windows 탐색기를 사용하여 직접 할 수 있습니다 . 명령 프롬프트에서 이러한 파일을 만들지 않으려는 의도는 없었지만 %특별한 의미가 있으므로 아래에 설명 된 구문을 사용하여 해당 파일을 만들어야합니다.

BAT 파일

당신이하는 경우 배치 파일 작성 (명령 프롬프트 응용 프로그램 일명) 명령 쉘에 의해 실행하세요 (* .BAT, * .CMD)를 사용하기 %로 파일을 작성 (예 : 문자로 %대체 할 이름으로, 그리고 변수 또는 매개 변수)를 %%대신 입력해야합니다 .

예를 들어

  • 명령 echo %windir%은 출력을 생성합니다.c:\windows
  • 그러나 command echo %%windir%%는 출력을 생성합니다.%windir%
  • 등등 : 명령 echo %%%%windir%%%%은 출력을 생성합니다 :%%windir%%

따라서 다음 줄을 다른 이름으로 저장 test.bat하고 실행하면 %test%퍼센트 기호로 complete 라는 이름의 디렉토리가 생성됩니다 .

md %%test%%

이름 이 지정된 변수 가 없는test 경우이 다음 명령은 마지막 명령과 동일하며 디렉토리도 작성합니다 %test%.

md %test%

…하지만 누군가가 그 이름으로 변수를 만들면 명령이 원하는 방식으로 작동하지 않으므로 절대 그렇게하지 마십시오.

forBAT 파일에서 명령을 사용하려는 경우 명령 쉘 자체 대신 명령에 %특별한 의미를 갖도록 두 배로 for늘려야합니다.

for %%i in (*.*) do echo %%i

이렇게하면 현재 디렉토리에 파일 목록이 생성됩니다 (즉, %%i특별한 의미가 있음) . 다음 섹션에서 설명 %%i하는 %p%해결 방법을 사용 하지 않고 리터럴 을 생성하는 방법을 잘 모르겠습니다 ( %%%%i여기에서는 작동하지 않음).

%명령 프롬프트에서 특별한 의미를 가진 유일한 문자는 아닙니다. 기타 포함 ^, <, >, |, (, ), &, !, ". 을 제외한 대부분의 문자는 이스케이프 처리" 할 수 있습니다 . 즉, 특수 문자를 삽입하여 리터럴 문자가 삽입되도록 이스케이프 문자를 접두어로 사용할 수 있습니다 . 또한 큰 따옴표로 묶은 문자열에서 특수 기능을 잃고 백 슬래시로 이스케이프됩니다 . 일부 캐럿 ( )은 큰 따옴표로 묶은 문자열 내부에서 두 배가되어야하고 지연된 변수 대체가 발생하는 곳 ( 특별한 의미) 이 필요할 수 있습니다 .^"\"^!

명령 프롬프트

불행히도, 명령 프롬프트 창에 명령을 직접 입력하면 %문자를 두 배로 늘리면 %%위와 같은 접근 방식이 작동하지 않습니다.

명령 처리 과정에서 문제를 악용하는 해결 방법이있는 것 같습니다 . after %를 입력하여 리터럴 을 얻을 수 있습니다 . 파일 이름이 큰 따옴표로 묶인 경우 문자 그대로 해석되며 따옴표없이 제거되지 않습니다.^%^

  • 명령 echo %windir%은 출력을 생성합니다.c:\windows
  • 명령 echo %^windir%은 출력을 생성합니다.%windir%
  • 명령은 echo "%^windir%"출력을 생성합니다 "%^windir%"(추가로 ^– 우리가 원하지 않는 것)

대신 다른 해결 방법을 권장합니다.

  • 다음과 같은 변수를 작성하십시오. set "p=%"
  • %p%리터럴 퍼센트 부호가 필요한 곳에 사용 하십시오 : echo "%p%windir%p%"이제 출력을 생성합니다 :"%windir%"

동일한 해결 방법을 사용하여 리터럴 퍼센트 로그인 for명령 을 가져올 수 있지만, for명령을 직접 입력 할 때 BAT 파일과 달리 퍼센트 부호는 두 배가 되지 않습니다 .

파일 시스템 예약 문자

일반적으로 이름에 다음과 같은 예약 문자가 포함 된 파일 또는 디렉토리를 작성할 수 없습니다. / ? < > \ : * | ", NULL 기호 및 코드가 1-31 인 문자; 또한 .공간은 마지막 문자가 될 수 없습니다; 다음 이름은 불법 com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn입니다..

그러나 이러한 제한 중 일부 는 다음과 \\?\같은 접두사 파일 경로를 무시할 수 있습니다 \\?\c:\test...\nul. 최소한 예약 된 이름을 가진 파일과 공백과 점으로 끝나는 파일은 그런 식으로 조작 할 수 있습니다.

또한 NTFS 파일 시스템 자체는 DOS, Windows 및 POSIX와 같은 여러 명명 하위 시스템을 지원합니다. 위의 모든 제한 사항이있는 것은 Windows 서브 시스템이지만 POSIX는 /NULL 기호 만 금지 합니다.

따라서 GNU / Linux OS (POSIX의 상위 집합)는 대부분의 일반 Windows API 기능 (및 Windows 프로그램)에서 사용할 수없는 파일 / 디렉토리 이름을 작성 및 삭제할 수 있습니다. Windows XP에서는 무료 “Services For Unix 하위 시스템”(SFU)을 설치하여 이들과 함께 작업 할 수있었습니다. Vista 및 그 이상의 타사 도구가 필요합니다. 새로운 ubuntu-on-windows10 하위 시스템이이를 수행 할 수 있는지 잘 모르겠습니다.


답변