Хитрости командной строки Windows
В DOS и Windows имя файла может содержать символы * и ?, означающие любое количество символов или один символ. С первого взгляда ничего сложного в них нет, но при более внимательном рассмотрении обнаруживаются некоторые интересные вещи.
В DOS на самом деле записывается два шаблона: один шаблон для имени, а затем через точку - шаблон для расширения, например, A*.T?? (все файлы, имя которых начинается с буквы A, а расширение - с буквы T). Если расширение не указано, считается, что оно может быть любым (например, A* эквивалентно A*.*).
Еще одна особенность: в DOS символы после звездочки не учитываются, например, *A работает так же, как *, то есть выдает все файлы, а не только заканчивающиеся буквой A. Поэтому в DOS имеет смысл использовать только те шаблоны, в которых звездочка стоит в конце, а не в начале или в середине. Приведу несколько примеров:
*BAT - файл, имя (не только расширение!) которого оканчивается на BAT, например, file.bat или acrobat (без расширения, например, каталог) или даже просто bat без расширения. Этот шаблон не будет правильно работать в DOS, зато в Windows 9x/2000/XP он выполняется превосходно. *A*A* - файл, содержащий не менее двух букв A. Этот шаблон работает только в Windows.
Windows 2000/XP различает имена без расширения (например, имена каталогов) и имена с расширением. Команды dir hosts и dir hosts.* в DOS и Windows 9x будут трактоваться одинаково (файл с именем hosts и любым расширением или без него, например, файлы hosts и hosts.sam). А в Windows 2000/XP команда dir hosts покажет только файл с именем hosts и без расширения, если такой есть.
Windows 9x считает, что вопросительный знак не может соответствовать отсутствию символа. Если указаны три вопросительных знака, то в Windows 9x - это именно три буквы, а в Windows XP и DOS - не менее трех букв.
Еще одна интересная особенность: все версии Windows проверяют, кроме длинных имен, еще и короткие. Из-за этого возникают некоторые странные и не вполне корректные ситуации. Вот некоторые из них:
????????.??? (соответственно, восемь и три знаков вопроса) - под Windows 9x покажет все файлы, у которых имя состоит из 8 символов, а расширение - из трех, а также все имена файлов длиннее восьми символов (так как все они имеют короткое имя из восьми символов, которое подходит под шаблон). В DOS и Windows 2000/XP будут показаны все имеющиеся в каталоге файлы, так как в этих ОС вопросительный знак может означать отсутствие символа.
??????.* - под Windows 9x покажет все имена файлов из шести символов с расширением из любого числа символов (например, System.ini и Readme.html) и без расширения (каталоги System, Config, SendTo). Под Windows 2000/XP - все имена файлов, содержащие не более шести символов, кроме расширения. Кроме упомянутых System.ini, Readme.html, System под этот шаблон подходят Temp, win.ini, wn.ini и другие.
??a???.* - под Windows 9x это имя файла из шести букв, третья из которых - буква A, расширение любое (например, readme.txt или dialer.exe). В Windows XP и DOS команда dir выдаст имена, содержащие 3, 4, 5 или 6 букв кроме расширения, причем третья буква должна быть буквой A (twain.log, sea.exe, readme.txt, dialer.exe).
*. (звездочка, точка) - все имена файлов без расширения. Считается, что в конце имени без расширения всегда стоит точка. Этот шаблон работает в DOS, Windows 9x/2000/XP.