Тема: 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 не вляпался на этом — для меня загадка.