1

Robocopy, кажется, иногда автоматически подстановочные расширения файлов при фильтрации. Например, использование « .m» возвращает «filename.m», а не «output.mat».Однако, «.txt» получает «filename.txt», но также и «dummyfile.txt-long».

Пока у меня есть это: robocopy "E:\WorkDirectory" "F:\BackupDirectory" * .txt /E

Я уже узнал, что могу исключать файлы специально через "/xf * .txt2".

Тем не менее, я бы предпочел более общее решение ... скажем, что-то, что будет работать для " .txt", но исключать ".txt1, * .txt2, * .txt3, ..." без перечисления всех из них. Спасибо!

1 ответ1

0

Вы обнаружили одно из старых изгнаний времен 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 в текущем каталоге. Там может быть достаточное количество настроек, чтобы заставить команду делать именно то, что вы хотите. Кроме того, проценты нужно будет удвоить, если вы используете команду в пакетном скрипте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .