Как найти и заменить указанную строку правилами, а затем записать в исходный файл? - PullRequest
0 голосов
/ 22 октября 2018

Я работал над пакетным сценарием с Powershell, его необходимо запустить с файлом расписания и содержимым следующим образом:

Server;Services;ContentPath;Status(Ready,Done,Disabled)
server1;servicename1;c:\test\;Ready
server2;servicename1,servername2;c:\test,d:\temp;Ready

Сценарий будет сканировать файл построчно.Извлеченное содержимое будет разделено и передано в функцию для проверки работоспособности.

Однако я обнаружил, что когда серверу не удается подключиться, и в тексте необходимо изменить Ready на disabled,текст будет перезаписан только одной текущей строкой.: - (

Get-Content -Path $PlayBook | where{$_ -match 'server1'} |%{$_.replace("Ready","Disable")} | Set-Content $PlayBook

Так есть ли в любом случае мы можем заменить указанное содержимое в тексте в соответствии с правилом? Или я должен преобразовать текст в файл CSV, может быть, есть больше методов и объектов, которые мы можемиспользовать?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 22 октября 2018

Ваша проблема where{$_ -match 'server1'}, потому что она действует как фильтр и передает только строки, соответствующие ей, следующей команде в конвейере.

Пример псевдокода:

import file | filter only lines containing 'server1' | replace text | export file

Поскольку filter соответствует только одной строке, только эта единственная строка передается по конвейеру в replace, а затем также только одну строку в export file.

Вам необходимо переместитьmatch условие внутри foreach ... затем вы перебираете каждый элемент (строку) и затем модифицируете элемент, если он соответствует вашим критериям:

(Get-Content -Path $PlayBook) | foreach {
    if ($_ -match 'server1'){
        $_.replace("Ready","Disable")
    }
    else {
        $_ # send item to pipeline so it's passed to next step
    }
} | Set-Content $PlayBook
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...