Скрипт PowerShell для обновления файла конфигурации на основе переменных env - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в PowerShell и пытаюсь выполнить несколько вещей здесь:

  1. У меня есть файл конфигурации агента zabbix, и я хочу иметь возможность изменить zabbix_agent_win.conf.
    • Имя хоста
    • ServerActive
    • HostMetaDataItem

Моя конечная цель - иметь скрипт PowerShell, который изменитИмя хоста, основанное на «$ env: ComputerName» и ServerActive, должно изменяться с заданным параметром, HostMetaData с заданным параметром - либо переменная env, которая может быть заполнена данным командлетом.Я начал играть и наткнулся на следующий скрипт:

$path = "C:\test.conf"
$word = $(Hostname) 
$replacement = $("$env:ComputerName")
$text = get-content $path 
$newText = $text -replace $word,$replacement
$newText > $path

Однако этот скрипт не работает для меня, и другая комбинация, которую я пробовал, не изменяет значение имени хоста на основе ("$ env:ComputerName »).

Я нашел другой предложенный вариант:

(Get-Content C:\test.conf -Raw).Replace('\$Hostname$\','\"$env:ComputerName"\') | 
Set-Content C:\test.conf

Пока не повезло,

Любая помощь приветствуется.

Спасибо, Кэтрин

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема вашего скрипта в том, что он ищет в файле фактическое значение имени хоста и затем заменяет его. Если ваш файл конфигурации содержит HOSTNAME=MyComputer, и вы запускаете его на компьютере с именем MyComputer, он найдет в файле MyComputer и заменит его значением переменной COMPUTERNAME, которое также равно MyComputer, в результате чего без изменений в файл. Если вы поместите заполнитель, такой как Hostname={replace this text}, то $(Hostname) по-прежнему преобразуется в 'MyComputer', а не {replace this text}, замена не найдет или не заменит ничего.

Чтобы найти Hostname=SOMETHINGELSE и заменить SOMETHINGELSE на $env:COMPUTERNAME, требуется немного больше работы.

Регулярное выражение

Этот подход использует -replace вместо .Replace(), что позволяет использовать регулярные выражения. Он использует группы захвата регулярных выражений для поиска строк, где появляется 'Hostname='. Поскольку это в скобках, это называется группа захвата 1, которая сохраняется и сохраняется в автоматической переменной $ 1. Это сохраняется процессором, а затем повторяется при замене. Все остальное в строке, представленное звездочкой (.*) (любой символ, повторяющийся 0 или более раз, затем заменяется на $env:COMPUTERNAME

(Get-Content "C:\test.conf" -Raw) -replace '(Hostname=).*',"`$1$($env:ComputerName)" | 
Set-Content "C:\test.conf"

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

Проверка и замена различных параметров

Используйте этот подход для проверки логики. Вы можете редактировать бит между @''@, чтобы представлять значения в вашем конфигурационном файле:

$zabbixserver='zabbix123'

@'
Hostname={MyCompName}
ServerActive={zabbix server hostname}
HostMetaData={system.uname}
'@ -replace '(ServerActive=).*',"`$1$zabbixserver" `
-replace '(Hostname=).*',"`$1$($env:ComputerName)"

Обратите внимание на использование символа 'backtick' для размещения строк -replace на отдельных строках

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