【元記事をASCII.jpで読む】

 Windowsにはファイル名やフォルダー名に「使えない」文字がある。しかし実際には、これ以外にも「使わないほうがいい」文字がある。今回は、そうした文字について考えてみる。

 Windowsファイル名やフォルダー名を一括して「パス名」とする。パス名には、ファイル名とフォルダー名、パス区切り文字が含まれている。パス名に使えない文字は、場所によっても異なる。たとえば、ファイルシステムに対するAPIで扱うパスなのか、アプリケーションが扱うパスなのか、コマンドラインのパスなのかで違いがある。しかし、ファイル名/フォルダー名には、パス区切り文字は入れることができない。標準では円マーク(逆スラッシュ)とスラッシュがパス区切り文字になっている。

Windowsファイル名に「使ってはいけない」文字

 Windowsには、ファイル名やフォルダー名に「使うことができない」文字があり、ファイル名を変更するとき、これらの文字が入ると警告を表示して、不可能であることを教えてくれる。それは以下の表のの9つの文字だ。

 これらは、MS-DOS時代からのルールである。ある意味、「command.com」のルールだとも言える。これらの文字がファイル名やフォルダー名に使えなくなったのは、コマンドラインで特別な意味を持つからである。MS-DOSはもともとコマンドラインですべての操作をする。このとき、コマンドラインで特別な意味を持つ記号文字に関しては、ファイルやフォルダー名での利用を禁止してコマンドラインファイル名、フォルダー名の判定を簡略化した。

 これらが今でも特殊扱いされていて、ファイルやフォルダーの名前に使えなくなっている。ただし、このことはNTFSやvFATなどのファイルシステムとしての仕様とは部分的にしか関係がない。パス区切り文字としての「\」と「/」は共通だが、他の文字は絶対ファイル名やパス名に入れられないのかというと、実はそうではない。ただし、ファイル名のAPIでもある程度の安全対策がしてあり、渡されたパスを解釈して処理している。そのため、APIやパラメーター指定によって、使えない文字には違いがある。なお、Windowsではどんな場合でも、「\\?\」で始まるパスは解釈処理をせず、そのまま扱う(ただしAPIが成功するとは限らない)。

コマンドラインでは「使えない」文字

 現在のWindows 10でもコマンドラインからのコマンド利用は可能で、そのためにcmd.exepowershell.exeの2つのコマンドラインインタープリターがある。特にcmd.exeは、command.comの後継であり、多くの特性を引き継いでいる。しかし、長年の間にコマンドライン機能が強化されたことで、使い方に注意が必要な文字が生じている。その顕著な例が「スペース」だ。スペースコマンドラインの引数を分離する記号文字としての働きがあり、MS-DOS時代はファイル名やパスにスペースを含めることができなかった。

 現在も使われている「Program Files」というフォルダーは、vFATが導入されたWindows 95で登場した。「ファイル名にスペースが使えるんですよ」ということを簡単にユーザーに理解してもらうための命名だったのかもしれない。一方でそれにより、多くのユーザーインストールされたアプリケーションの起動パスをダブルオートで括らねばならなくなった。

 cmd.exe内でダブルオートで括らねばならない文字は、スペースだけではない。cmd.exeオンラインヘルプによれば、ファイル名に以下の文字が含まれている場合には、ダブルオートで括る必要がある。

& ( ) [ ] { } ^ = ; ! ' + , ` ~

 これらは、コマンドラインやバッチでは特別な意味を持つ文字だ。たとえば、「&」は、cmd.exeでは、コマンドラインの区切りと解釈される。「^」は、cmd.exeのエスケープキャラクタとして使われている。基本的には、これらの文字がパスに含まれている場合、全体をダブルオートで括れば安全である。このことはPowerShellでも同様だ。ただし、PowerShellコマンドの引数ではなく、起動するプログラムのパスを表記するような場合に「&('パス')」という表記を使う必要がある。たとえば「c:\program files\test\test.exe」という実行ファイルの場合、cmd.exeでは

"c:\program files\test\test.exe"

とすればよいが、Powershellでは、

&'c:\program files\test\test.exe'

として先頭に「&」を置き、シングルオートで括る必要がある。PowerShellではダブルオートは変数展開をするため、変数を表す「$」がパス中に含まれていると、これが展開され変数値に置き換えられてしまう。シングルオートはこれをしない(ちなみにcmd.exeシングルオートに特殊な意味を持たせずダブルオートだけが有効)。

 先頭に「&」は、後続部分を評価(実行)するという意味で、これがないと、PowerShellでは単なる文字列の表示コマンドになってしまう。このあたり、PowerShellが言語側にちょっと倒し過ぎちゃった感があり、シェルとしてはイマイチ人気がない理由の1つなのだと思う。プログラムのステートメントとしては、これでもいいのだが、コマンドラインの場合には、別処理にしてもいいんじゃないかと思う。ちなみに、スペースなどを含まずシングルオートで括る必要がないパスには「&」を付ける必要はない。

 入力行の補完機能を使えば、自動的に「&」を付けてシングルオートで括ってくれる。しかし、それを使わずに手入力で「"C:\program files\……"」といったcmd.exe方式の実行ファイルの指定をすると、入力行が表示されるだけというのは、かなりダメージがあり、それ以来PowerShellが嫌いになったという多数のユーザーを作ってしまったのではないかと思われる。

 cmd.exeは、簡易なパス入力が可能な反面、厄介な問題が結構ある。大きなものは「%」による環境変数の置換機能だ。cmd.exeコマンドラインでは、環境変数名を「%」で囲った文字列は、実行前に環境変数の値に置換される。著名なのは、ユーザーホームディレクトリを示す「%UserProfile%」だろう。

 たとえば、「%UserProfile%\test.exe」とすれば、ユーザーホームディレクトリにあるtest.exeコマンドを起動するコマンドになる。ところが、この環境変数置換は、環境変数が定義されてないと何も置き換えが起こらない。UserProfileは、Windowsが起動時に用意する環境変数なので、常に存在し置換されるが、testなどの環境変数名は定義されていないと置換されない。

 このため「%test%.exe」といったコマンドラインは、testという環境変数がない場合には、文字通りのコマンドだが、testxyzという文字列が定義されると、「xyz.exe」と置換されたのち起動しようとする。環境変数の置換を禁止するには「^」を使って「^%test^%.exe」と指定する必要がある。同様の文字には「!」があり、こちらは遅延環境変数置換が有効(cmd.exeの起動オプションなど)になっている場合、「%」とほぼ同じ意味を持つ(違いは、置換が行われるタイミング)。

 なお、環境変数置換は、環境変数名の前後が%で囲まれている必要があり、片側のみの場合には置換されない。しかし、複雑なバッチファイル中で扱われた場合など、思わぬ副作用を生む可能性がある。そんなわけで、cmd.exepowershell.exeを使う場合には、使わない方がいい文字があるわけだ。

OneDriveでもファイル名に問題が発生するケースがある

 さらにOneDriveOneDrive for Business(法人向けMicrosoft365などで利用できる)にも、ファイル名やフォルダー名に利用できない文字がある。これに関しては、以下のページに記載がある。

●Invalid file names and file types in OneDrive and SharePoint - Office Support
●ファイル名のコンマが ^J に書き換えられる理由 - OneDrive (家庭と個人用)

 OneDriveで利用できない文字は、現時点では、ローカルファイル名、フォルダー名と同じだ。OneDrive for Businessでは、さらに以下の文字も使うことができない

~ # % & { | } .

 OneDriveクラウド上のサービスなので、URLに関連する特殊文字をファイル名に利用できなくなっている。ただし、バージョンによって違いがあり、以前はカンマが利用できなかったが、現在では可能になったようだ。Officeファイルは、OneDriveOneDrive for Businessに自動アップロードすることが想定されており、一部の文字を置き換えている。

 OneDriveOneDrive for Businessを今は使っていなくても将来的に使う可能性がないとは言い切れないし、これらを使うユーザーファイルを渡す可能性もある。クラウドの活用は年々普及している。そう考えると、クラウド側で問題が出るような文字は今から利用を控えたほうがいいだろう。

それではファイル名に安全に使える記号文字は?

 では、ASCIIコードの記号文字のうち、安全なのはどれなのだろうか。それぞれについて、command.com(表中はcommandと表記)、cmd.exe(同cmd)、PowerShell(同PS)、OneDrive(同OD)、OneDrive for Business(同OD4B)それぞれで調べた結果が以下の表だ。どの環境でも問題がないものは「安全」列に◎をつけてある。これによれば、安心して使えるのは、マイナスアットマークアンダーバーの3つのみ。

 それ以外の◯になっている文字に関しては、ダブルオートcmd.exe)、シングルオートpowershell.exe)で囲む必要があり使い方に注意が必要になる。それは、カッコプラスイコール、角カッコの4種、6つの記号文字だ。

 安全欄に×が書いてあるのは、ファイル名、フォルダー名で禁止されている文字、何もないのは使うとトラブルにハマりやすいので避けた方がよい文字だ。

 こうしてみると、安心して使える記号は意外に少ない。もっともアルファベットと数字、そして2バイト文字(Unicode)は逆に安心して利用できる。かつては全角文字のファイル名は気持ち悪いと思われていたし、2バイト目が利用できない文字と同一のコードを持つ場合にエラーになっていたこともあった。だが、現代では逆に安心して使えるファイル名といえる。それに気がついてから漢字のファイル名に抵抗がなくなってきた。

Windowsでファイルやフォルダーに「使わない方がいい」文字


(出典 news.nicovideo.jp)

Windowsでファイルやフォルダーに「使わない方がいい」文字

これ気をつかないと笑





<このニュースへのネットの反応>



↓ ランキングに参加していますのでどちらか一つクリックして応援、お願いします。

PC・ネットニュースランキング

ネット・PC(全般)ランキング

人気ブログランキング