Удалить файл с подстановочным знаком в командной строке с неверным соответствием

На регулярной основе я пытаюсь очистить некоторые папки данных для программы ERP, прежде чем делать резервную копию и выполнять обслуживание таблиц данных. Я использовал проводник Windows для поиска посторонних резервных копий и временных файлов перед полным резервным копированием (процедуры обслуживания создают резервные файлы во время процесса, которые не всегда удаляются), но я хотел бы просто запустить все это через пакетный файл для упрощения и ускорения процесса. Я фильтрую следующим образом:

*NGT????????????.old
*Wrk*????????????.m4t

Кроме того, команда, которую я использую:
del /S /Q

Оба они отлично работают, хотя функция поиска в Проводнике. Первый корректно работает в командной строке, а второй нет. Серии ? создаются программным обеспечением ERP в качестве метки времени, чтобы указать, что копия оригинала была создана в то время. И второй * представляет собой идентификатор пользователя из одного или двух символов, который указывает пользователя, создавшего файл (это не так важно, за исключением того, что длина символов не всегда одинакова). Когда я пытаюсь отфильтровать в командной строке этот второй фильтр, он не только захватывает нужные мне файлы, но также захватывает исходные файлы, которые НЕ имеют отметку времени. . Например, следующие имена файлов:

Файл 1) AR_AgedInvoiceReportWrk.M4T
Файл 2) AR_AgedInvoiceReportWrkTB081615903027.M4T

Файл 2 — единственный, который следует удалить, но он удалит и файл 1, и файл 2. Я даже пытался использовать два или три ?s вместо второго *, просто чтобы увидеть, произойдет ли разница, но это не так. 'т.

Командная строка не распознает? как это делает Проводник? Что мне не хватает?


person Michael McCauley    schedule 27.09.2013    source источник
comment
Командная строка не распознает? как это делает Проводник? Краткий ответ на это — нет. Сначала прочитайте это: Как подстановочные знаки работали в MS-DOS ? и помните, что сопоставление шаблонов Cmd.exe обратно совместимо.   -  person Bill_Stewart    schedule 16.09.2015
comment
Забыл упомянуть и об этом: Почему FindFirstFile находит короткие имена?. Лучший обходной путь, который я могу предложить, — это использовать вместо этого PowerShell, который не страдает от этих особенностей обратной совместимости.   -  person Bill_Stewart    schedule 16.09.2015


Ответы (1)


DIR и, кажется, другие инструменты соответствуют короткому имени файла и длинному имени файла. Ваши короткие имена файлов имеют wrk в качестве начальных символов, а затем вы соответствуете целому набору любых символов.

Решение состоит в том, чтобы использовать что-то вроде DIR /b /a-d и передать его через findstr с регулярным выражением, и это будет соответствовать только длинным именам файлов.

person foxidrive    schedule 27.09.2013
comment
Я отредактировал текст выше, но на самом деле ничего нет Wrk в начале. Wrk всегда стоит в конце коротких имен файлов. Это не различение краткой формы от длинной. Но вот в чем дело... Есть корневой каталог с подкаталогами, и все эти файлы будут в подкаталогах. Может ли этот метод добраться до подкаталогов? - person Michael McCauley; 28.09.2013
comment
Конечно, если вы измените маску спецификации файла вопроса, то wrk не будет впереди. Если вы правильно сформулируете задачу, вы можете получить соответствующее пакетное решение. Здесь читает много опытных людей, которым нравится решать задачу. - person foxidrive; 28.09.2013