gpt4 book ai didi

windows - 为什么 Windows 上的 cmd.exe shell 会因使用正斜杠 ('/' ') 路径分隔符的路径而失败?

转载 作者:可可西里 更新时间:2023-11-01 12:25:59 24 4
gpt4 key购买 nike

就在我以为我已经看到了所有 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 shell 而不会出现在 PowerShell 中(大概也不会出现在 win32 API 中):

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

另一个有趣的地方是,使用“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 经常引用的文档中都找不到关于这个特定问题的任何引用资料:

Naming Files, Paths, Namespaces

这让我不禁要问:为什么会发生这种情况,是否有记录这一怪癖的权威来源?

更新:

dbenham 指出无论目录名称中是否有空格,问题都会存在,因此在标题和问题正文中删除了对它的引用。还添加了一个有效的“cd ./”示例,而其他命令则无效。

最佳答案

编辑以删除意见

无论 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 也不应给出该结果。

关于windows - 为什么 Windows 上的 cmd.exe shell 会因使用正斜杠 ('/' ') 路径分隔符的路径而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10523708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com