1

Тема: CMD/BAT: некоторые документированные особенности использования масок

Скорее всего, для большинства сие будет далеко не новость.

Посыл: CMD/BAT - [решено] Пакетный файл для выборки из спика файлов текстовый(название и описание).

Предисловие: Создаём на диске «C:» папку «0001». Создаём в ней (для воспроизведения взяты имена файлов с оригинального обсуждения) файлы:

aaaa.bat
bbb
Финуправления в .doc
Финуправления в Интернете.doc
Финуправления в.doc
Финуправления.doc

Можно воспользоваться следующим пакетным файлом:

@echo off
setlocal

set sPath=c:\0001

md "%sPath%"

copy nul "%sPath%\aaaa.bat" >nul
copy nul "%sPath%\bbb" >nul
copy nul "%sPath%\Финуправления в .doc" >nul
copy nul "%sPath%\Финуправления в Интернете.doc" >nul
copy nul "%sPath%\Финуправления в.doc" >nul
copy nul "%sPath%\Финуправления.doc" >nul

endlocal
exit /b 0

Собственно, обсуждение: Если файловая система на диске «C:» — NTFS, и политикой не отключено формирование коротких имён файлов «8.3», то команда «dir»:

dir a*.*

выдаст не совсем ожидаемый результат:

 Содержимое папки C:\0001

18.05.2010  22:13                 0 Финуправления в Интернете.doc
18.05.2010  22:13                 0 aaaa.bat
18.05.2010  22:13                 0 Финуправления в .doc
               3 файлов              0 байт

В данном случае (да и в прочих, о коих речь пойдёт ниже, тоже), похоже, следует винить функцию FindFirstFile Function (Windows):

Remarks

The following list identifies some other search characteristics:

* The search includes the long and short file names.

То бишь, в поиск включаются как длинные, так и короткие имена файлов. В данном конкретном примере короткие имена:

dir /x
 Содержимое папки C:\0001

18.05.2010  22:13                 0              aaaa.bat
18.05.2010  22:13                 0              bbb
18.05.2010  22:13                 0 ABF5~1.DOC   Финуправления в .doc
18.05.2010  22:13                 0 A5BF~1.DOC   Финуправления в Интернете.doc
18.05.2010  22:13                 0 06EE~1.DOC   Финуправления в.doc
18.05.2010  22:13                 0 67E2~1.DOC   Финуправления.doc
               6 файлов              0 байт

Аналогичное поведение можно наблюдать и в случае команды «del» (параметр «/p» добавлен для подтверждения):

del /p a*.*
C:\0001\Финуправления в Интернете.doc, Удалить [Y(да)/N(нет)]? n
C:\0001\aaaa.bat, Удалить [Y(да)/N(нет)]? n
C:\0001\Финуправления в .doc, Удалить [Y(да)/N(нет)]? n

и в случае команды «copy»:

copy a*.* c:\0002\
Финуправления в Интернете.doc
aaaa.bat
Финуправления в .doc
Скопировано файлов:         3.

и даже при использовании отбора «for…»:

for %i in (a*.*) do @echo.[%i]
[Финуправления в Интернете.doc]
[aaaa.bat]
[Финуправления в .doc]

Вот так.

По тем же принципам ведётся поиск при использовании в маске «?», например:

dir ??e???.???
 Содержимое папки C:\0001

18.05.2010  22:13                 0 Финуправления в.doc
18.05.2010  22:13                 0 Финуправления.doc
               2 файлов              0 байт

Столь же плачевно выглядит использование масок в «FileSystemObject» в WSH:

Dim objFSO, objFile

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

WScript.Echo "Before"
For Each objFile In objFSO.GetFolder("c:\0001").Files
    WScript.Echo objFile.Name
Next

objFSO.DeleteFile "c:\0001\a*.*"

WScript.Echo
WScript.Echo "After"
For Each objFile In objFSO.GetFolder("c:\0001").Files
    WScript.Echo objFile.Name
Next
Before
aaaa.bat
bbb
Финуправления в .doc
Финуправления в Интернете.doc
Финуправления в.doc
Финуправления.doc

After
bbb
Финуправления в.doc
Финуправления.doc

равно как и в AutoIt, и в AHK (код не привожу).

В конце приведу, для наглядности, как выглядит содержимое каталога с этими файлами в Far Manager при отображении длинных и коротких имён:

╔══════════════════════════ C:\0001 ═════╤══════╤════════╤═════╗╔══════════════════════════ C:\0001 ════╤══════╤════════╤═23:11
║и                 Имя                   │Размер│  Дата  │Время║║и                 Имя                  │Размер│  Дата  │Время║
║ ..                                     │ Вверх│18.05.10│23:09║║ ..                                    │ Вверх│18.05.10│23:09║
║►aaaa                                bat│     0│18.05.10│22:13▓║►aaaa                               bat│     0│18.05.10│22:13▓
║ bbb                                    │     0│18.05.10│22:13░║ bbb                                   │     0│18.05.10│22:13░
║ Финуправления                       doc│     0│18.05.10│22:13░║ 67e2~1                             doc│     0│18.05.10│22:13░
║ Финуправления в                     doc│     0│18.05.10│22:13░║ 06ee~1                             doc│     0│18.05.10│22:13░
║ Финуправления в .                   doc│     0│18.05.10│22:13░║ abf5~1                             doc│     0│18.05.10│22:13░
║ Финуправления в Интернете           doc│     0│18.05.10│22:13░║ a5bf~1                             doc│     0│18.05.10│22:13░
║                                        │      │        │     ░║                                       │      │        │     ░

P.S. Как я сам, лично, за четырнадцать лет пользования NTFS не вляпался на этом — для меня загадка.

2

Re: CMD/BAT: некоторые документированные особенности использования масок

Продолжение эпопеи — Ошибка при использовании xcopy для копирования файлов с расширением более 3 символов:

megaloman пишет:

Пусть у нас есть 3 файла

f.ab
f.abc
f.abcd

Напишем:

xcopy *.ab uuu\

Скопируется 1 файл «f.ab»
Напишем:

xcopy *.abc uuu\

Скопируется 2 файла: «f.abc» и «f.abcd».

Очередной баг?

amel27 пишет:

Они подходят по короткому имени (DIR/X), вроде уже обсуждали тут: CMD/BAT - [решено] Пакетный файл для выборки из спика файлов текстовый(название и описание)

Действительно, короткие имена выглядят так:

f.ab
f.abc
F0AD2~1.ABC

с соответствующими результатами.

У кого есть в одной папке одновременно документы старого формата «*.doc» и нового «*.docx» — выложите сюда результат:

dir *.doc

и

dir /x *.doc

3

Re: CMD/BAT: некоторые документированные особенности использования масок

справедливо, если не отключены короткие имена

исследование полезное

Я конечно далек от мысли... (с)

4

Re: CMD/BAT: некоторые документированные особенности использования масок

smaharbA пишет:

справедливо, если не отключены короткие имена

Угу:

alexii пишет:

Если файловая система на диске «C:» — NTFS, и политикой не отключено формирование коротких имён файлов «8.3»…

5

Re: CMD/BAT: некоторые документированные особенности использования масок

Ну и и для полноты темы. Отключение создания коротких имен:

Установить значение ключа реестра (REG_DWORD)
HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisable8dot3NameCreation = 1

Что эквивалентно запуску утиилиты Fsutil вот так вот:

fsutil behavior set 8dot3name 1

+ перезагрузка.

Нас невозможно сбить с пути, нам пофигу куда идти.