Проблема вашего скрипта в том, что он ищет в файле фактическое значение имени хоста и затем заменяет его. Если ваш файл конфигурации содержит 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
на отдельных строках