2015-10-08 3 views
2

По-видимому, Windows (или, по крайней мере, некоторая часть Windows) игнорирует несколько обратных косых черт в пути и рассматривает их как одну обратную косую черту. Например, выполнение любого из этих команд из командной строки или в окне Run открывает Блокнот:Документированное поведение для нескольких обратных косых черт в путях 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 Вопрос, который даже упоминает поведение.

Примечание:. Я не спрашиваю о путях UNC (\\ ServerName), на \\ \ префикс, или \\»двойные кавычки побег

Примечание: Я наткнулся на это поведение при работе с . пакетный файл, одна строка в пакетном файле выглядела примерно так:

"%SOME_PATH%\myapp.exe" 

После расширения переменной, команда выглядела так:

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

к моему удивлению, пакетный файл, запускаемый как желание d и не сбой с какой-то ошибкой «путь не найден».

+4

Microsoft, как и большинство других поставщиков программного обеспечения, никогда не документирует свои «неправильные, но я все равно соглашусь». Документирование это узаконивает, делая это неправильно. –

ответ

4

В большинстве случаев функции API Win32 будут принимать широкий диапазон вариаций в формате имени пути, включая преобразование относительного пути в абсолютный путь, основанный на текущем каталоге или текущем каталоге на каждом диске, интерпретируя одну точку как «этот каталог» и две точки как «родительский каталог», преобразование косых черт в обратную косую черту и удаление посторонних обратных косых черт и периодов возврата.

Так что-то вроде

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

будет ветер истолковано как

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

Some of this is documented, некоторые нет. (Как отмечает Ханс, документирование такого рода обходного метода узаконивает его неправильное использование.)

Обратите внимание, что это относится к API Win32, не обязательно к каждому приложению или даже к каждому системному компоненту. В частности, командный интерпретатор имеет более строгие правила при работе с длинным путем, и 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', с другой стороны, вполне доволен тем же синтаксисом. –

Смежные вопросы