можно использовать Findstr, чтобы обнаружить, если «Shutdown» появится 5 или более раз в любом месте файла. Вся информация, которая вам нужна, содержится в пределах What are the undocumented features and limitations of the Windows FINDSTR command?, но это более чем сложно, и совсем не очевидно.
Поиск в регулярном выражении может соответствовать нескольким экземплярам Shutdown по нескольким строкам, если все промежуточные символы, включая символы возврата каретки и строки, соответствуют соответствующему диапазону классов символов. Я не могу публиковать персонажи, необходимые здесь, поэтому я буду использовать символическую нотацию в угловых скобках.
Следующее выражение регулярного выражения будет соответствовать любому байтовому символу, кроме 0xFF (decimal 255). Он состоит из выражения класса символов с двумя диапазонами и промежутком в середине для 0xFF. Зазор имеет решающее значение, потому что FINDSTR потерпит неудачу (и, возможно, зависнуть), если 0xFF входит:
[<0x01>-<space><tab>-<0xEA>]
Вы можете подумать, что выражение должно быть [<0x01>-<0xFE>]
, но это не работает, потому что FINDSTR не сверять символы числового значения коды ,
Так, чтобы посмотреть на 5 или более экземпляров Shutdown
в любом месте файла, вам потребуется следующее регулярное выражение поиска:
Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown[<0x01>-<space><tab>-<0xEA>]*Shutdown
В 0xEA (десятичное 234) символов представляет собой расширенный символ ASCII и расширенные ASCII не могут быть включены в командную строку поиска FINDSTR. Таким образом, строка поиска должна быть помещена во внешний файл и должна использоваться опция /G:file
.
Вот полный пакетный скрипт, который принимает минимальное количество экземпляров Shutdown для поиска в качестве первого аргумента и имя файла для поиска в качестве второго аргумента. Опять я использую символическую нотацию в угловых скобках вместо фактических символов.
@echo off
set count=%1
set file=%2
setlocal enableDelayedExpansion
set "search="
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-<0xEA>]*"
set "search=!search:~0,-9!"
echo(!search!>search.txt
findstr /rg:search.txt %file% >nul&&echo FOUND||echo NOT found
Максимальное поддерживаемое количество ограничено максимальной длиной строки регулярного выражения. Для XP максимальная длина регулярного выражения составляет 127 байтов, что соответствует счету 7. В Vista и Windows 7 максимальная длина регулярного выражения составляет 254 байта, что должно поддерживать подсчет 15. Но мое тестирование в Windows 7 поддерживало только подсчет до 12. Дополнительные тесты показывают, что максимальная длина зависит от количества строк и классов символов, а также относительного размещения каждого из них. Но я не смог найти точную формулу.
Если вы не хотите использовать внешний файл, то следующее выражение регулярного выражения почти так же хорошо. Он соответствует любым символам, за исключением следующих расширенных шестнадцатеричных кодов ASCII: 0xE0, 0xE2, 0xE3, 0xE4, 0xE5, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xED, 0xEE, 0xFF.
[<0x01>-<space><tab>-Z]
Полный поиск регулярного выражения будет:
Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown[<0x01>-<space><tab>-Z]*Shutdown
А вот полный пакетный скрипт:
@echo off
setlocal enableDelayedExpansion
set count=%1
set file=%2
set "search="
for /l %%N in (1 1 %count%) do set "search=!search!Shutdown[<0x01>-<space><tab>-Z]*"
set "search=!search:~0,-9!"
findstr /rc:"!search!" %file% >nul&&echo FOUND||echo NOT found
OMG RLY? Хорошо, поэтому, если бы я хотел переменное число '. * Shutdown. *' 'S, мне нужно было бы цитировать 'вокруг [и вокруг] {x}'? – Arj
Вы получили его в одном. Как обычно - half-er, -BAKED-реализация .... – Magoo
Я только что попробовал свой код и, похоже, не вернул правильный результат .. он не находит строку – Arj