Найдите * .html в папке и запустите определенный код - PullRequest
0 голосов
/ 19 декабря 2011

тип "S: \ Images * .html" | findstr / v Подпись | findstr / v герметики | конструкция findstr / v> S: \ Images \ .html

Я разработал вышеуказанный текст. Я не лучший в пакетном сценарии, однако знаю, как использовать переменные (в PHP и C ++).

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

Загвоздка в том, что я не очень хорошо разбираюсь в переменных и ищу их в пакетном скрипте. Я хочу перезаписать файл, который я изменяю.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011
for "eol=: delims=" %%f in ('findstr /s /m /l "Signature sealants construction" "*.html"') do (
  findstr /l /v "Signature sealants construction" "%%f" >"%%f.tmp"
  del "%%f"
  ren "%%f.tmp" "%%~nxf"
)

Выше следует запустить из папки, где вы хотите начать поиск. Внешний цикл находит все HTML-файлы, содержащие любое из слов. Внутри цикла он записывает каждый найденный файл в файл .tmp, удаляя все строки, содержащие хотя бы одно из слов. Затем он просто удаляет старый файл и переименовывает .tmp в исходный.

Если вы хотите, чтобы при поиске учитывался регистр, добавьте параметр / i к обеим командам FINDSTR.

Я боюсь, что поиск слишком общий. Любое из слов может появиться в нескольких контекстах. Это может привести к катастрофическим непреднамеренным результатам. Я думаю, вам могут понадобиться более конкретные шаблоны для поиска. FINDSTR поддерживает грубые регулярные выражения. Если вы можете найти правильное регулярное выражение для каждой удаляемой строки, вы можете изменить / l на / r и заменить строку поиска в кавычках на три аргумента / c: RegularExpression, по одному на каждое регулярное выражение. Конечно, это будет сделано для обеих команд FINDSTR. Также может помочь, если имя .html имеет какой-то шаблон, чтобы сделать его более избирательным.

Наконец, вместо того, чтобы просто переписывать оригинал .html, было бы безопаснее сохранить копию оригинала на случай, если что-то пойдет не так. Я рекомендую заменить строку del "%%f" в моем коде на

  del "%%f.bak" 2>nul
  ren "%%f" "%%~nxf.bak"
1 голос
/ 19 декабря 2011

как вы пришли с этим кодом?Вы должны научиться шаг за шагом внедрять решение (будь то файл BAT или нет), читать руководство, пробовать себя и устранять проблемы.

Когда вы попробуете свой код, вы поймете, что делает команда TYPE (она не перечисляет каталог).См. «HELP TYPE».

Вам необходимо использовать команду FOR.Смотрите HELP FOR, а затем попробуйте это в командной строке

 FOR %a in (*.HTML) do @echo %a

, а затем прочитайте HELP FINDSTR и попробуйте это в командной строке

 FOR %a in (*.HTML) do @findstr /v "Signature sealants construction" %a

И вы почти закончили.Есть небольшие изменения, которые вы должны будете сделать, чтобы поместить его в файл .BAT: чтобы использовать FOR в BAT, вам нужно заменить% va на %% a;добавить некоторые @echo off и другие заклинания;удалить @ в командной строке;...

Собрав все воедино, наберите следующий код

 @echo off
 FOR %%a in (*.HTML) do (
    FINDSTR /i /v "Signature sealants construction" %%a >%%~na.html.new
 )
 echo del *.html
 echo ren *.html.new *.html

протестируйте его и измените в соответствии с вашими потребностями, помните, что это только отправная точка.Когда все правильно, удалите ECHO.

...