Вы обнаружили одно из старых изгнаний времен DOS. ROBOCOPY
не добавляет подстановочный знак к расширению, а соответствует короткому 8.3 имени файла.
В свое время имена файлов были ограничены базовым именем с максимальной длиной 8, за которым следовало расширение с максимальной длиной 3. Когда были добавлены возможности длинных имен файлов, был необходим метод, позволяющий старым программам продолжать работать с длинными именами. Таким образом, каждому файлу, который не соответствует спецификации 8.3, автоматически присваивается (есть) альтернативное короткое имя, которое соответствует спецификации.
Короткие имена по-прежнему актуальны и по сей день, и операционная система автоматически сопоставляет имена подстановочных имен с длинными и короткими именами.
Таким образом, имя файла, например somename.txt-long
становится чем-то вроде SOMEFI~1.TXT
. Вы можете понять, почему это короткое имя соответствует маске вашего файла.
К сожалению, нет способа помешать ROBOCOPY (или любой другой встроенной команде) сопоставить короткое имя. Поскольку имена 8.3 вызывают проблемы, с которыми вы сталкиваетесь, многие системные администраторы отключают имена 8.3, особенно в корпоративной среде.
Если ваши файлы хранятся на томе NTFS, и если вы запускаете консоль от имени администратора, вы можете отключить 8.3 имен с помощью FSUTIL
. Это может быть сделано в масштабе всей системы или на основе объема. Однако это только предотвращает создание новых имен 8.3 - существующие имена 8.3 все еще сохраняются. Вы также можете использовать FSUTIL
для удаления существующих имен 8.3, но есть потенциальные проблемы с реестром, которые могут вызвать проблемы. Я никогда не использовал команду, поэтому я не знаю все входы и выходы.
Без отключения имен 8.3, единственное известное мне решение - это обработка файлов с использованием вашего собственного цикла FOR /F
сочетании с DIR /B
переданным в FINDSTR
для удаления файлов с расширениями длиннее 3. Вы также должны предоставить команду для обработки каждого соответствующего файла в отдельности. Что-то вроде:
for /f "eol=: delims=" %F in ('dir /b /a-d *.txt^|findstr /lie ".txt"') do @someCommand "%F" ...
Выше будет обрабатывать все файлы .txt в текущем каталоге. Там может быть достаточное количество настроек, чтобы заставить команду делать именно то, что вы хотите. Кроме того, проценты нужно будет удвоить, если вы используете команду в пакетном скрипте.