Правильный синтаксис для замены нескольких строк в Powershell

У нас есть каталог из более чем 3000 HTML-файлов, которые переносятся на сайт sharepoint, и нам нужно очистить некоторые данные.

Конкретные ситуации:

  • Примерно 1/3 файлов содержат XML-заголовок <?xml version="1.0" encoding="utf-8"?>, который не нравится sharepoint. Мы планируем просто удалить эту строку заголовка.
  • В каждом файле есть параметры javascript для «HOME», которые указывают на две альтернативные относительные ссылки на домашнюю страницу foo1.htm или foo.htm. Мы хотим изменить оба на абсолютную ссылку http:\\sharepoint.site\home.aspx
  • Каждый файл также имеет параметр ссылки javascript «Показать», который мы просто хотим скрыть, изменив его на ''.

Вот моя функция до сих пор:

function scrubXMLHeader {
    $srcfiles     = Get-ChildItem $backupGuidePath -filter "*htm.*"                              
    $srcfilecount = (Get-ChildItem $backupGuidePath).Count                                       
    $selfilecount = $srcfiles.Count                                                              
    # Input and Ouput Path variables
    $sourcePath        = $backupGuidePath 
    $destinationPath   = $workScrubPath
    "Input From: $($sourcePath)" | Log $messagLog -echo          
    " Output To: $($destinationPath)" | Log $messageLog -echo
    #
    $temp01 = Get-ChildItem $sourcePath -filter "*.htm"
    foreach($file in $temp01)
    {
        $outfile = $destinationPath + $file
        $content = Get-Content $file.Fullname | ? {$_ -notmatch "<\?xml[^>]+>" } 
        Set-Content -path $outfile -Force -Value $content
    }
}

Я хочу добавить следующие два редактирования в каждый документ:

-replace '("foo.htm", "", ">", "Home", "foo1.htm")', '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx")
-replace 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");', ''

Я не уверен, как объединить их в один оператор, поэтому я открываю файл, вношу изменения, сохраняю и закрываю файл вместо трех отдельных транзакций открытия-редактирования-сохранения/закрытия. Я также не уверен, что со всеми кавычками и запятыми лучший способ избежать этих символов или достаточно ли одинарных кавычек, окружающих всю строку.

Понимание того, что «запрашивать регулярные выражения для анализа произвольного HTML, например, попросить Пэрис Хилтон написать операционную систему, иногда уместно проанализировать ограниченный, известный набор HTML", но, поскольку мой набор инструментов ограничен PowerShell, я пытаюсь понять, как лучше всего добавить два -replace строк в существующую переменную $content... разделенные запятыми в фигурных скобках? перекликались друг с другом?

Является ли следующая лучшая стратегия? или есть что-то лучше?

$content = Get-Content $file.Fullname | ? {$_ -notmatch "<\?xml[^>]+>", 
    -replace '("foo.htm", "", ">", "Home", "foo1.htm")', '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx"),
    -replace 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");', '' } 

person dwwilson66    schedule 19.12.2013    source источник
comment
Каждый раз, когда вы разбираете HTML с помощью регулярного выражения, девушка-кошка где-то умирает. Подходящие инструменты в вашем распоряжении. Используй их.   -  person Ansgar Wiechers    schedule 20.12.2013
comment
СПАСИТЕ ДЕВУШЕК-КОШЕК! К сожалению, мой набор инструментов распространяется на powershell v1.0; Я нахожусь в пользовательской зоне и заблокирован больше, чем хочу, чтобы выполнять свою работу. Я уверен, что если бы ИТ-специалисты могли найти способ извлечь PS из Win7, чтобы я не мог его использовать, они бы это сделали. Ни один из правильных инструментов, которые вы упомянули, мне не доступен, потому что у меня нет надлежащих разрешений ... не заставляйте меня начинать с этого.   -  person dwwilson66    schedule 20.12.2013
comment
Tidy является необязательным для предварительного уточнения кода. Остальное встроено в Windows/PowerShell.   -  person Ansgar Wiechers    schedule 20.12.2013


Ответы (1)


Если я правильно читаю вопрос, я думаю, что это может сделать то, что вы хотите:

$Regex0 = '<?xml version="1.0" encoding="utf-8"?> '

$Regex1 =  '("foo.htm", "", ">", "Home", "foo1.htm")'
$Replace1 =  '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx")'

$Regex2 = 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");'


foreach($file in $temp01)
    {
        $outfile = $destinationPath + $file
        (Get-Content $file.Fullname) -notmatch $Regex0,'' -replace $Regex1,$Replace1 -replace $Regex2,'' |
         Set-Content -path $outfile -Force -Value $content
    }
person mjolinor    schedule 19.12.2013
comment
Теоретически да, но без регулярного выражения. :) Строка ИСПОЛЬЗОВАНИЕ регулярного выражения была для меня элегантной, потому что она просто исключает строку, соответствующую шаблону; Я пытался понять, как добавить к этому две другие строки -replace... можно ли включить в фигурные скобки серию шагов и разделить их запятыми? результаты каждого прохода передаются следующему -replace? - person dwwilson66; 20.12.2013
comment
обновил скрипт. Вы можете связать операторы match/notmatch и -replace, и отфильтрованные/замененные результаты будут переданы следующему оператору, поэтому вам не нужен промежуточный конвейер. - person mjolinor; 20.12.2013
comment
ага... в этом есть смысл. Благодарю. Я также обновил свой вопрос, чтобы прояснить детали и сделать очевидным, что я не пытался убить девочек-кошек с помощью регулярных выражений. :) - person dwwilson66; 20.12.2013
comment
Вы можете убить их в любом случае. У них девять жизней, но у вас есть цикл foreach, так что все зависит от того, сколько файлов у вас есть. - person mjolinor; 20.12.2013