Как получить список файлов, которые не соответствуют шаблону регулярного выражения? - PullRequest
0 голосов
/ 30 августа 2018

Мне нужна помощь в создании пакетного сценария Windows для перечисления файлов, которые не соответствуют этому регулярному выражению в данном каталоге:

^[0-9]{5}\s[A-Z].*$

Пример:

Выходные данные должны быть именами файлов: ABC_12345.txt и 123456-ABC.pdf и 1234 NO.doc.

Но имя файла 12345 ABC.txt не должно выводиться пакетным сценарием.

Кроме того, если было бы здорово, если бы скрипт мог экспортировать список в файл C:\temp\DoesNotMatch.txt.

1 Ответ

0 голосов
/ 30 августа 2018

FINDSTR может использоваться для фильтрации вывода DIR , чтобы получить требуемый список:

@dir /A-D /B | %SystemRoot%\System32\findstr.exe /I /R /V /C:"^[0123456789][0123456789][0123456789][0123456789][0123456789] [ABCDEFGHIJKLMNOPQRSTUVWXYZ]" >C:\temp\DoesNotMatch.txt

DIR выводит из-за /A-D только файлы (атрибут, а не каталог) в текущем каталоге в голом формате из-за опции /B, которая означает только имя файла с расширением файла, но без пути к файлу. Запустите в окне командной строки dir /? справку по этой команде и ее параметрам.

Этот вывод DIR перенаправляется на FINDSTR с оператором перенаправления |. Пожалуйста, прочитайте статью Microsoft о Использование операторов перенаправления команд для получения подробной информации.

FINDSTR выполняется без учета регистра из-за /I поиска по регулярному выражению из-за /R для строк, соответствующих выражению, указанному в двойных кавычках с параметром /C:, и выводит инвертированный результат из-за параметра /V, что означает строки, в которых регулярное выражение не соответствует ни одной строке.

Опция /C:"..." должна использоваться здесь для указания интерпретируемой строки, поскольку /R является регулярным выражением, а не литеральной строкой, в противном случае при использовании только "..." пробел будет интерпретирован как разделитель между двумя регулярными выражениями. искать строки, которые будут ИЛИ применены к каждой строке.

Строка поиска по регулярному выражению выглядит немного странно, поскольку синтаксис регулярного выражения, поддерживаемый FINDSTR , очень ограничен. Запустите в окне командной строки findstr /? справку по этой команде, ее параметрам и поддержке регулярных выражений. Я рекомендую прочитать дополнительно SS64 - FINDSTR и Каковы недокументированные функции и ограничения команды Windows FINDSTR?

^ ... означает начало строки, которая является началом имени файла из-за отсутствия пути к файлу.

[0-9] может использоваться, но также соответствует ¹, ², ³. По этой причине [0123456789] используется для реального соответствия только любому из этих 10 цифр.

Множитель типа {5} не поддерживается FINDSTR . По этой причине необходимо пять раз написать определение класса символов в поисковом выражении.

Класс символов \s, соответствующий любому символу пробела в соответствии со стандартом Unicode, не поддерживается FINDSTR . Но вертикальные пробелы недопустимы или очень необычны в именах файлов, символ горизонтальной табуляции не допускается в имени файла, пробел без пробелов возможен в имени файла, но это также не очень обычно. И специальные символы со значениями кода Unicode U + 1680, U + 180E, U + 2000 до U + 2008, скорее всего, также никогда не используются в именах файлов. Таким образом, \s можно заменить обычным пробелом.

[A-Z] можно использовать, но также соответствует множеству других символов, таких как ÄäÖöÜü, чтобы перечислить здесь только некоторые из них. Поэтому лучше использовать [ABCDEFGHIJKLMNOPQRSTUVWXYZ] для сопоставления без учета регистра только символов ASCII.

Вывод FINDSTR перенаправляется с > в файл C:\temp\DoesNotMatch.txt, который перезаписывается в случае уже существующего при выполнении командного файла с этой единственной командной строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...