2015-10-08 96 views
2

顯然,Windows(或至少Windows的某個部分)會忽略路徑中的多個反斜槓,並將它們視爲單個反斜槓。例如,從命令提示符或運行窗口中執行這些命令打開記事本:Windows路徑中多個反斜槓的記錄行爲

C:\Windows\System32\Notepad.exe 
C:\Windows\System32\\Notepad.exe 
C:\Windows\System32\\\Notepad.exe 
C:\Windows\System32\\\\Notepad.exe 
C:\\Windows\\System32\\Notepad.exe 
C:\\\Windows\\\System32\\\Notepad.exe 

這甚至可以在命令行上傳遞的參數的工作:

notepad "C:\Users\username\Desktop\\\\myfile.txt" 

這種行爲記錄地方?我嘗試了幾次搜索,只發現this SO問題,甚至提到了行爲。

注:我不是問UNC路徑(\\服務器名),在\\。\前綴,或\\」雙引號逃逸

注:我偶然發現了這種行爲與工作時。批處理文件批處理文件一號線看起來是這樣的:

"%SOME_PATH%\myapp.exe" 

變量擴展後,命令看起來像:

"C:\Program Files\Vendor\MyApp\\myapp.exe" 

令我驚訝的是,作爲慾望執行批處理文件d並且沒有失敗,出現某種「未找到路徑」錯誤。

+4

與大多數軟件供應商一樣,微軟從不記錄他們的「這是錯誤的,但我會接受它」解決方法。記錄它合法化做錯了。 –

回答

4

在大多數情況下,Win32 API函數將接受路徑名稱格式中的各種變體,包括根據當前目錄或每個驅動器當前目錄將相對路徑轉換爲絕對路徑,將單個點解釋爲「此目錄」和兩個點作爲「父目錄」,將正斜槓轉換爲反斜槓,並刪除多餘的反斜槓和尾隨句點。

因此,像

c:\documents\..\code.\\working\.\myprogram\\\runme.exe.. 

會倒閉解釋爲

c:\code\working\myprogram\runme.exe 

Some of this is documented,有的不是。 (正如漢斯指出的那樣,記錄這種解決方法合法化的做法是錯誤的。)

請注意,這適用於Win32 API,不一定適用於每個應用程序甚至每個系統組件。特別是,命令解釋程序在處理長路徑時有更嚴格的規則,並且Explorer不會接受點或雙點,並且通常不會接受正斜槓。另外,如果服務器未運行Windows,則網絡驅動器的規則可能會有所不同。

+0

@Leon的缺點,謝謝編輯。事實上,整個段落都是不正確的,我被命令解釋器的行爲誤導了。 –

0

沒有任何結果,因爲你甚至不能用反斜槓命名文件或文件夾。因此,多個連續的反斜槓將始終被視爲路徑中的一個分隔符。

+0

這是不正確的。你可以用'dir c:\',但不能'dir c:\\' –

+0

'dir C:\\'不起作用,但是'dir C:\ Windows \\'確實有效。 'dir'命令必須使用稍微不同的邏輯。 – kevinbatchcom

+1

是的,許多內置命令本身解析路徑名,因此與Win32 API有一些不同的規則。推測這是爲了與DOS向後兼容。如果你說'dir c:\\ Users \ xyzzy',你會得到「網絡路徑沒有找到」,所以看起來雙反斜槓離啓動太近會讓'cmd.exe'混淆,認爲它是UNC路徑。另一方面''notepad.exe'完全滿意相同的語法。 –

相關問題