Можно ли производить поиск и замену в файлах контента в нескольких сетевых расположениях? - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно найти строку, а затем заменить ее другой в нескольких файлах. Звучит просто, но самое сложное в том, что это несколько файлов в разных местах сети. Я попытался подключиться ко всем местоположениям одновременно с помощью vscode, а затем с помощью встроенной функции поиска и замены. Это все работает, за исключением, когда я добираюсь до больших поисков, кажется, зависает. Сейчас я ищу другой, более стабильный способ сделать это. У кого-нибудь есть идеи? Я думал, что powershell мог бы стать хорошим конкурентом, но, к сожалению, я не так привык работать с powershell.

Я нашел это руководство, и оно немного похоже на то, что я хочу, за исключением того, что мне нужно сделать это для нескольких файлов в нескольких местах одновременно.
https://mcpmag.com/articles/2018/08/08/replace-text-with-powershell.aspx

Я бы предпочел запустить по одному сценарию для каждого местоположения, поскольку для сканирования доступно только <20 местоположений. Но это должно включать подпапки. <br>

Любые советы приветствуются, спасибо! :)

Редактировать 1: Структура папок отличается от местоположения к местоположению, поэтому трудно сказать, как это выглядит. Но я могу сказать, что ни в одной папке нет структуры папок глубже 15 шагов. Текст, который я заменяю, - это отпечатки сертификатов, хранящихся в .config файлах. Файлы имеют длину от 100 до 1000 символов, а заменяемые мной отпечатки выглядят примерно так d2e8c58e5b34021671f2121483572f03f54ab9ae

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Предполагается, что различные местоположения сети находятся в доверенных доменах или, по крайней мере, в части доверенных хостов wmi. Удаленное взаимодействие PowerShell также необходимо включить на всех задействованных компьютерах. Запустите (в режиме PowerShell с повышенными правами) Enable-PSRemoting -Force , чтобы включить удаленное взаимодействие PowerShell

$command = { Get-ChildItem -Path C:\Test\ -Include *.config -Name -Recurse | ForEach-Object {$configContent = Get-Content -Path $_ -Raw; $configContent.Replace("Old Value", "New Value") | Out-File -FilePath ($_.FullName) -Force } }

Invoke-Command -ComputerName "TestServer1", "TestServer2", "etc..." -ScriptBlock $command

Если вы не являетесь частью домена, но у вас есть домен / сервер, вам нужно будет использовать переключатель -Credentials для функции Invoke-Command . Это в основном найдет все файлы с расширением .config в любых подпапках в пути, получит текущее содержимое файла .config, заменит ваше значение и, наконец, перезапишет существующий файл конфигурации. WATCH OUT THOUGH это позволит получить КАЖДЫЙ .config файл, который находится по этому пути. Если у вас есть более одного, он также захватит его, но если у него нет строки, он просто перепишет тот же файл.

0 голосов
/ 12 апреля 2019

Не видя примера структуры папок и файлов, довольно сложно дать исчерпывающий ответ. Однако я бы, вероятно, построил серию ForEach сегментов. Например:

ForEach ($Server in $Servers)

    {
        ForEach ($File in $Files)
            {
                Select-String -Path $File -Pattern "$ExampleString" 
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...