21

Windows パスの問題ですべてを見たと思っていたちょうどその時、'/' (スラッシュ) がパス区切り文字として使用されている場合にのみ失敗するケースに遭遇しました。

C:\temp\tcbugs>mkdir "dir1 with spaces"

C:\temp\tcbugs>echo hi > "dir1 with spaces"\foo.txt

C:\temp\tcbugs>type "dir1 with spaces\foo.txt"
hi

C:\temp\tcbugs>type "dir1 with spaces/foo.txt"
The system cannot find the file specified.

これについて特に興味深いのは、これが cmd.exe シェルに固有であるように見え、PowerShell では発生しないことです (おそらく win32 API でも発生しません)。

PS C:\temp\tcbugs> type 'dir1 with spaces/foo.txt'
hi

もう 1 つの興味深い点は、'cd' でディレクトリを変更し、cmd.exe でパス区切りとして使用される '/' を使用すると機能することです。

C:\temp\tcbugs>mkdir dir2_no_spaces

C:\temp\tcbugs>cd ./dir2_no_spaces

C:\temp\tcbugs\dir2_no_spaces>cd ..

それでも、この特定の問題への参照は、オンラインのどこにも、MSDN の一般的に引用されているドキュメントにも見つかりません。

ファイル、パス、名前空間の命名

なぜこれが起こるのか、この癖を文書化した決定的な情報源はありますか?

アップデート:

dbenham は、ディレクトリ名にスペースが含まれているかどうかに関係なく問題が存在することを指摘しているため、タイトルと質問本文での参照を削除しました。また、「cd ./」が機能する例を追加しましたが、他のコマンドは機能しません。

4

3 に答える 3

9

編集して意見を削除

Windows CMD.EXE がパスでスラッシュをサポートすることになっているかどうかに関係なく、実際には機能する場合と機能しない場合があり、機能しているように見えても間違った結果が返される場合があります-別名バグ。

いくつかの実験の時間です:-)

すべてのテストは Vista で実行されました

C:\>md "c:/temp/"

C:\>REM The forward slash works with MD!

C:\>echo hello world 1>>"c:/temp/test.txt"

C:\>REM Redirection works with forward slashes!

C:\>type "c:\temp\test.txt"
hello world

C:\>REM Of course TYPE works with back slashes

C:\>type "c:/temp/test.txt"
The system cannot find the file specified.

C:\>REM But forward slash version fails

C:\>type "c:/temp\test.txt"
hello world

C:\>REM But TYPE works with forward slash as long as last slash is back slash

C:\>dir "c:/temp/test.txt"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

File Not Found

C:\>REM Note how DIR lists the directory with a \, yet fails to find any files

C:\>dir "c:/temp/*"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

File Not Found

C:\>REM DIR Still fails with forward slashes

C:\>dir "c:/temp/"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

05/09/2012  09:58 PM    <DIR>          .
05/09/2012  09:58 PM    <DIR>          ..
05/09/2012  09:58 PM                13 test.txt
               1 File(s)             13 bytes
               2 Dir(s)  337,001,615,360 bytes free

C:\>REM But forward slash works if no file is specified!

C:\>dir "c:/temp\test.txt"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

05/09/2012  09:58 PM                13 test.txt
               1 File(s)             13 bytes
               0 Dir(s)  337,001,615,360 bytes free

C:\>REM And DIR works with forward slash as long as last slash is back slash


C:\>REM Now add another folder to the path hierarchy

C:\>md "c:/temp/temp/"

C:\>REM Still can create folder using forward slashes

C:\>copy "c:/temp/test.txt" "c:/temp/temp/"
The system cannot find the file specified.
        0 file(s) copied.

C:\>REM Failed to copy with forward slashes

C:\>copy "c:/temp\test.txt" "c:/temp/temp/"
        1 file(s) copied.

C:\>REM But forward slash works if last slash before file name is back slash


C:\>REM Rerun some past tests

C:\>type "c:/temp/test.txt"
The system cannot find the file specified.

C:\>REM Good - it still fails

C:\>dir "c:/temp/test.txt"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

05/09/2012  09:58 PM                13 test.txt
               1 File(s)             13 bytes
               0 Dir(s)  337,001,615,360 bytes free

C:\>REM What is going on?! :( Why did that seem to work now?
C:\>REM More on that later.


C:\>REM Now test the new folder

C:\>type "c:/temp/temp/test.txt"
The system cannot find the file specified.

C:\>REM Forward slashes still fail with TYPE

C:\>type "c:/temp/temp\test.txt"
hello world

C:\>REM But forward slash still works as long as last slash is back slash

C:\>dir "c:/temp/temp/*"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp\temp

File Not Found

C:\>REM Again, forward slashes fail, but directory path is listed properly

C:\>dir "c:/temp/temp/"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp\temp

05/09/2012  09:58 PM    <DIR>          .
05/09/2012  09:58 PM    <DIR>          ..
05/09/2012  09:58 PM                13 test.txt
               1 File(s)             13 bytes
               2 Dir(s)  337,001,615,360 bytes free

C:\>REM And again it works if no file is specified

C:\>dir "c:/temp/temp\test.txt"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp\temp

05/09/2012  09:58 PM                13 test.txt
               1 File(s)             13 bytes
               0 Dir(s)  337,001,615,360 bytes free

C:\>REM Again forward slashes work as long as last slash is back slash

これは明らかにバグを示すケースです。

c:\>dir /s /a-d temp
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

05/10/2012  08:01 AM                13 test.txt
               1 File(s)             13 bytes

 Directory of c:\temp\temp

05/10/2012  07:57 AM                10 test.txt
               1 File(s)             10 bytes

     Total Files Listed:
               2 File(s)             23 bytes
               0 Dir(s)  337,325,191,168 bytes free

c:\>REM Note the different file sizes found in each directory

c:\>dir "c:/temp/test.txt"
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of c:\temp

05/10/2012  07:57 AM                10 test.txt
               1 File(s)             10 bytes
               0 Dir(s)  337,325,191,168 bytes free

c:\>REM It is listing the wrong file!

Windows CMD がスラッシュをサポートすることが「想定」されているかどうかについて議論することができます。しかし、その最後の結果はバグです! スラッシュの使用にオペレータ エラーがあったとしても、Windows はその結果を返すべきではありません。

于 2012-05-10T02:13:00.760 に答える
-1

Wie はスラッシュを使用した奇妙な動作をしており、先頭にスラッシュがあるパスは絶対パスとは見なされないという事実にまでたどり着きました。

C:\>cd /temp

C:\temp>rem works we are in the root directory

C:\temp>cd /temp
Das System kann den angegebenen Pfad nicht finden.

C:\temp>rem does't work but

C:\temp>cd \temp

C:\temp>rem \ indicates absolute path

C:\temp>cd ..

C:\>cd /temp

C:\temp> cd /ca

C:\temp\CA>rem qed

おそらく、上記のバグも説明しています-コマンドが実行されるディレクトリが明確ではありません。

于 2013-06-06T13:03:10.670 に答える
-7

「/」が PS で機能する理由がわかりません。歴史をさかのぼると、DOS は UNIX に基づいており、UNIX の小さなセットです。UNIX ではパス区切り文字は「/」ですが、DOS では「\」です。以前、いくつかの Windows および DOS アプリに取り組みました。コマンドやパスなどのUNIXパターンを変換し、それらが有効なDOSコマンドまたはパスであることを確認するために、次のように「/」を「\」に変換する小さなコンバーターを作成しました。

string fileNameFromWeb;
...
string windowsFile = fileNameFromWeb.repleace("/", @"\");

Windows でファイルにアクセスする場合は、この機能をアプリのトレラント '/' に追加できます。PSには、「/」または「\」を使用したコマンドまたはパスを許可するこの型コンバーターがあると思います。そうしないと、Windowsはファイル名に「/」を使用します。

于 2012-05-09T20:45:02.173 に答える