Windowsエクスプローラーで、パーセント記号が既存の変数に使用されている場合、なぜパーセント(%)記号でフォルダーまたはファイルを作成できるのですか?


13
  1. Windowsエクスプローラに移動し、という名前のフォルダ/ディレクトリを作成し%systemdrive%%windir%または任意の他の既存の変数。
  2. コマンドプロンプトを開き、作成したフォルダーに移動します。

%フォルダー名にパーセント記号()があるため、コマンドプロンプトを混乱させるため、できません。パーセント記号は既存の変数に使用されるためです。

%パーセント記号(%%)を2つのパーセント記号()でエスケープしても機能しないため、DavidPostillの答えは間違っています。

エクスプローラーデスクトップの一部が表示されたコマンドプロンプトウィンドウ では、Windowsエクスプローラーで%、パーセント記号が既存の変数に使用されている場合、なぜパーセント記号()を持つフォルダーまたはファイルを作成できるのでしょうか?

回答:


16

なぜパーセント記号でフォルダー/ファイルを作成できるのですか?

%文字は、ファイル名の予約文字ではありません。

ファイル、パス、および名前空間の命名用の予約文字は次のとおりです。

< (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パラメーターに対して特別な意味を持ちます。

パーセントを通常の文字として扱うには、それを2倍にします。

%%

ソース構文


参考文献


1
注:すべての予約文字がNTFSファイルシステムに適用されるわけではありません。たとえば、Linuxを使用すると、という名前のファイルを簡単に作成できます<test>。Windowsのファイル管理機能を使用して実行することはできません。
ネイサンオスマン

2
@NathanOsman生の絶対パス表記(\\?\C:\USERS\DEFAULT\<test>)を使用して、Windows内からこれらの名前のファイルを作成できる場合があります。
-zwol

@zwolああ?知りませんでした。知っておくといいです。
ネイサンオスマン

@zwol cmdシェルからではありません... F:\test>md \\?\f:\test\<test> コマンドの構文が正しくありません。
DavidPostill

@DavidPostillどうmd \\^?\f:\test\^<test^>ですか?
zwol

11

DavidPostillの答えは素晴らしいが、新参者を少し混乱させるかもしれない。言い換えます。

%予約文字ではありません。

これは、コマンドシェルに対して特別な意味を持つ文字です(別名および)cmd.execommand.com

違いは:

  • 予約文字はまったく使用できません(ただし、以下を参照)
  • 特殊文字とエスケープ文字を使用できる場合があります-そのまま入力するだけではありません

つまり、%名前に含まれるファイルまたはフォルダーを作成できます。Windowsエクスプローラーを使用して直接実行できます%。特別な意味がないためです。コマンドプロンプトでそのようなファイルを作成できないようにする意図もありませんでした%が、そこには特別な意味があるため、そのようなファイルを作成するには、以下に概説する構文を使用する必要があります。

BATファイル

あなたがいる場合は、バッチファイルの書き込み(コマンドプロンプトアプリケーション別名)コマンドシェルによって実行されます(* .BAT、* .CMD)を、使用する%と、ファイルを作成するために、(のような文字通り%の代替に名前ではなく、変数またはパラメーター)を%%代わりに入力する必要があります。

例えば、

  • コマンドecho %windir%は出力を生成します:c:\windows
  • ただし、コマンドecho %%windir%%は出力を生成します。%windir%
  • など:コマンドecho %%%%windir%%%%は出力を生成します:%%windir%%

したがって、次の行をtest.bat名前を付けて保存して実行すると、%test%パーセント記号付きの名前が付けられたディレクトリが作成されます。

md %%test%%

という名前変数がない場合test、この次のコマンドは最後のコマンドと同等です-また、ディレクトリを作成します%test%

md %test%

...しかし、誰かがその名前の変数を作成すると、あなたのコマンドはあなたが望むように振る舞わないので、そのようにしないでください

forBATファイルでコマンドを使用する場合は、コマンドシェル自体ではなくコマンドに%特別な意味を持たせるために、二重にする必要もありforます。

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

これにより、現在のディレクトリにファイルのリストが作成されます(つまり、%%i特別な意味があります)。次のセクションで説明%%iする%p%回避策に頼らずにリテラルを作成する方法がわかり%%%%iません(ここでは機能しません)。

%コマンドプロンプトで特別な意味を持つ唯一の文字ではありません。その他には^<>|()&!"。それらのほとんど(を除く")はエスケープすることができます。つまり、エスケープ文字を前に付けて^リテラル文字を挿入し、その特別な意味を抑制できます。これらも二重引用符で囲まれた文字列内の特別な機能を失い"、バックスラッシュでエスケープされます:\"。一部のキャレット(^)は、二重引用符で囲まれた文字列内で、変数の遅延置換が行われる場所で二重にする必要がある場合があります(!特別な意味)。

コマンド・プロンプト

残念ながら、コマンドプロンプトウィンドウにコマンドを直接入力する場合、%文字を2倍にすると%%、上記の方法は機能しません。

コマンド処理に癖を利用し、回避策があるように見える-あなたは文字通り得ることができます%タイピングによって^%。しかし、そのアプローチは絶対確実ではありません:ファイル名が二重引用符で囲まれている場合、^文字通りに解釈されます(引用符なしのように削除されません)

  • コマンド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サブシステムがそれを実行できるかどうかはわかりません。


パス/コマンド名にキーボードタグを使用するのはなぜですか?インラインコードの書式設定を使用した場合、構文がより正確になり、読みやすくなります。また、入力しやすくなります:ではなくバックティック<kbd>
コーディグレイ

できた。<kbd> tags </ kbd>のアウトラインは、よりもずっと明確だと思いましたcode blocks。しかし、そのような疑問が生じた場合、混乱を引き起こすと思います。
ジャックホワイト

2
「コマンドシェルのエスケープ記号です」正しくありません。cmdのエスケープ文字は^です。%は、「コマンドラインパラメーターとFORパラメーターに対して特別な意味を持つ文字です。パーセントを通常の文字として扱うには、2倍にします」。
DavidPostill

実際、私は用語が混同されていました。答えを修正しました。ありがとう。
ジャックホワイト

また、私の答えで概説し%forようforに、バッチファイル内にある場合にのみダブルインすることに注意してください。for %%i in (*) do echo %%iコマンドpropmtウィンドウに入力すると、の不適切な外観を引用してエラーが生成されます%%i
ジャックホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.