Вопрос по windows, command-line, batch-file, cmd, dir – Странное поведение команд Windows DIR

16

Я обнаружил это совершенно случайно, когда искал файл с номером в названии. Когда я печатаю:

dir *number*

(где число представляет любое число от 0 до 9 и без пробелов между звездочками и числом)

в командной строке cmd.exe он возвращает различные файлы, которые не отображаются ни в одном из них, чтобы соответствовать критериям поиска. Что странно, так это то, что в зависимости от каталога одни номера будут работать, а другие - нет. Например, в каталоге, связанном с веб-сайтом, я набираю следующее:

dir *4*

и что возвращается:

Directory of C:\Ampps\www\includes\pages 

04/30/2012  03:55 PM               153 inventory_list_retrieve.php
06/18/2012  11:17 AM             6,756 ix.html
06/19/2012  01:47 PM           257,501 jquery.1.7.1.js
               3 File(s)        264,410 bytes
               0 Dir(s)  362,280,906,752 bytes free

Это просто не имеет никакого смысла для меня. Любая подсказка?

Вопрос ставится на stackOverflow, потому что команда DIR часто сочетается с FOR в пакетных программах. Странное поведение DIR может сделать пакетные программы потенциально ненадежными, если они используют команду DIR.

Изменить: (дополнительная заметка). Хотя прошло много времени, я обнаружил еще одну причуду, которая почти стоила мне много работы. Я хотел удалить все.htm файлы в определенном дереве каталогов. Я понял, прежде чем сделать это, что*.htm Матчи.html файлы также. Также,*.man Матчи.manifestи есть, вероятно, другие. Удаление всех.html файлы в этом конкретном каталоге были бы расстроены, если не сказать больше.

Хотя этот вопрос явно не касается пакетного программирования, основная проблема имеет серьезные последствия для пакетного программирования. Пожалуйста, не закрывайте этот вопрос на том основании, что он не имеет отношения к программированию. dbenham
Если бы существовала возможность голосовать против голосования, я бы закрылся. Если вопрос будет закрыт, я бы проголосовал за открытие. Это касается основной проблемы с Windows API, которая раскрывается как в командной строке, так и в пакетных файлах. ИМХО это явно по теме для тегов batch и cmd. RBerteig
Интересно! Нам нужно сделать тест по этому вопросу ... Aacini
Вау, после всех этих лет - все еще поражен этой технологией. Я могу подтвердить это странное поведение. Helbreder

Ваш Ответ

4   ответа
3

команда dir ищет также короткие (в манере 8.3) имена файлов под капотом.

Когда я звонюdir *1* вот что я получаю:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads
2012-05-20  17:33        23 639 040 gDEBugger-5_8.msi
2012-05-20  17:30           761 942 glew-1.7.0.zip
2012-05-20  17:11         9 330 176 irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

EстьgDEBugger-5_8.msi файл среди перечисленных, который, по-видимому, не имеет каких-либо1 характер в этом.

Все становится ясно, когда я использую/X переключиться с помощью команды dir, которая заставляет dir использовать 8.3 имен файлов. Выход изdir /X *1* команда:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads


2012-05-20  17:33        23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi
2012-05-20  17:30           761 942 GLEW-1~1.ZIP glew-1.7.0.zip
2012-05-20  17:11         9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

Цитата из справки dir:

/X          This displays the short names generated for non-8dot3 file
            names.  The format is that of /N with the short name inserted
            before the long name. If no short name is present, blanks are
            displayed in its place.
15

менем файла, так и с коротким & quot; 8.3 & quot; имя, если кто-то присутствует. Это может преподнести сюрпризы.

Чтобы увидеть короткие имена, используйте/X вариант кDIR команда.

Обратите внимание, что это поведение никоим образом не относится кDIR команда, и может привести к другим (часто неприятным) сюрпризам, когда подстановочный знак соответствует больше, чем ожидалось в любой команде, такой какDEL.

В отличие от оболочек * nix, замена шаблона файла списком совпадающих имен реализована в каждой команде и не реализована самой оболочкой. Это может означать, что разные команды могут реализовывать разные правила шаблонов шаблонов, но на практике это довольно редко, поскольку Windows предоставляет вызовы API для поиска в каталоге файлов, соответствующих шаблону, и большинство программ используют эти вызовы очевидным образом. Для программ, написанных на C или C ++, использующих «обычный» инструменты, это расширение предоставляется "бесплатно" с помощью библиотеки времени выполнения C, используя Windows API.

Windows API в вопросеFindFirstFile() и его близкие родственникиFindFirstFileEx(), FindNextFile(), а такжеFindClose().

Как ни странно, хотя документация дляFindFirstFile() описывает свой параметр lpFileName как & quot; каталог или путь и имя файла, которое может включать символы подстановки, например звездочку (*) или вопросительный знак (?) & Quot; он никогда не определяет, что* а также? символы означают.

Точное значение шаблона файла имеет историю вCP / M операционная система, датируемая началом 1970-х годов, которая сильно повлияла (некоторые могут сказать, что она «была скопирована напрямую» вместо «повлияла» здесь) на дизайн MSDOS. Это привело к ряду «интересных» артефакты и поведение. Часть этого в конце спектра DOS описана вэтот блог с 2007 года, где Раймонд описывает, как именно файловые шаблоны были реализованы в DOS.

12

что он также ищет короткие имена, если вы попробуете это:

dir /x *4*

(ключ / x для коротких имен)

для фильтрации имен файлов используйте:

dir /b | find "4"
если вы хотите искать только длинные имена, используйте | находить
+1, да, "скрытый" короткие имена файлов могут вызвать проблемы, которые не очевидны. Предложение использовать FIND должно работать:dir /b | find "4", Использование FINDSTR вместо этого позволило бы более выборочную фильтрацию через регулярные выражения.
4

Note that this behavior is not in any way specific to the DIR command, and can lead to other (often unpleasant) surprises when a wild card matches more than expected on any command, such as DEL.

Вышесказанное верно даже для команды FOR, что очень неприятно.

for %A in (*4*) do @echo %A contains a 4

также будет искать короткие имена. Решением снова будет использование FIND или FINDSTR для более надежной фильтрации имен.

for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4

Note - change %A to %%A if using the command within a batch file.

Объединение FOR с FINDSTR может быть универсальным методом для безопасного использования любой команды, которая сталкивается с проблемами с короткими именами файлов. Просто замените ECHO на проблемную команду, например, COPY или DEL.

Похожие вопросы