Powershell Заменить цитируемый текст в нескольких файлах - PullRequest
1 голос
/ 10 января 2020

Чтобы синхронизировать c файл с нашим сервером ECM, мне нужно отсканировать файл метаданных, который содержит следующие строки:

  <data-items>
   <item type="primary" id="OLL5638" module="PY" descriptor="Payroll">
      <description>Leave Application Number - 1234</description>
    </item>
    <item type="secondary" id="123" module="PY" descriptor="Payroll">
      <description>Joe Bloggs</description>
    </item>
    <item type="secondary" id="123" module="PY" descriptor="Payroll">
      <description>Joe Bloggs</description>
    </item>

Мне нужно изменить строку PRIMARY так, чтобы она принудительно сбой процесса 'docloader' в элементе PRIMARY, а затем попытка синхронизировать c файл с использованием элемента SECONDARY.

Мой файл PS1 выглядит следующим образом

$Path = "C\Temp\Tester\*.METADATA"
$SearchStr = <item type="primary" id="([A-Z]*\d*)" module="PY" descriptor="Testing">
$ReplTxt = <item type="primary" id="$1" module="PY" descriptor="Testing">
Get-ChildItem -Path $Path |
foreach{
(Get-Content $_ | foreach {$_ -replace $SearchStr, $ReplTxt)} | Set-Content $_ }

Я пробовал все перечисленные ниже и до сих пор не могу заставить его работать.

ДВОЙНЫЕ ЦИТАТЫ

$ SearchStr = "" $ ReplTxt = ""

ОДНО ЦИТАТЫ

$ SearchStr = '' $ ReplTxt = ''

REGEX ESCAPE

[Regex] :: escape ($ SearchStr =) [Regex] :: escape ($ ReplTxt =)

REGEX ESCAPE с одинарными кавычками [Regex] :: escape ($ SearchStr = '') [Regex] :: escape ($ ReplTxt = '')

REGEX ESCAPE с двойными кавычками [Regex] :: escape ($ SearchStr = <"item type = "primary" id = "([AZ] <em>\ d )" module = "PY" descriptor = "Testing"> ") [Regex] :: escape (" $ ReplTxt = ")

РУЧНЫЕ ПРОБЛЕМЫ - (я пробовал также с комбинациями одинарных и двойных кавычек), например: вставить обратную косую черту sh перед любой двойной цитатой

Любые указатели в правильном направлении будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Спасибо, Ральф. Ссылки могли указать мне правильное направление.

Если я исключаю '<' и '>' и просто ищу:

'item type="primary" id="([A-Z]*\d*)" module="PY" descriptor="Payroll"'

Используя регулярное выражение ([AZ ] \ d ) вместо 'OLL5638' (который я изначально цитировал), я делаю мой скрипт динамическим c, чтобы я мог обновить несколько файлов в папке (папках). и замените на:

'item type="primary" id="$1" module="PY" descriptor="TESTING"'

Итак, мой последний сценарий -

$Path = "C:\Temp\Tester"
$FindTxt =  'item type="primary" id="([A-Z]*\d*)" module="PY" descriptor="Payroll"'
$ReplTxt = 'item type="primary" id="$1" module="PY" descriptor="TESTING"'

write-Output "__________ Processing.... ________________"
Get-ChildItem $Path -Filter "*.METADATA" |
Where-Object { $_.Attributes -ne "Directory"} |
ForEach-Object {
    If (Get-Content $_.FullName | Select-String -Pattern $FindTxt) {
        write-Output $_.FullName
        (Get-Content $_.FullName) -replace $FindTxt, $ReplTxt | Set-Content  $_.FullName
        }
    }
pause
0 голосов
/ 10 января 2020

Существует несколько вариантов управляющих символов в Windows, в зависимости от используемых функций cf https://www.robvanderwoude.com/escapechars.php

В PowerShell escape-символ для " является обратным трюком ` (тот, который используется здесь для маркировки встроенного кода), см. https://serverfault.com/questions/47811/what-is-the-literal-escape-character-in-powershell

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