基于 env 变量更新配置文件的 PowerShell 脚本

PowerShell script to update config file based on env variables

我是 PowerShell 的新手,想在这里完成一些事情:

  1. 我有一个 zabbix 代理配置文件,我希望能够更改 zabbix_agent_win.conf。
    • 主机名
    • ServerActive
    • 主机元数据项

我的最终目标是拥有一个 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

还没有运气,

感谢任何帮助。

谢谢, 凯瑟琳

您的脚本的问题是它在文件中查找 actual 主机名值,然后替换它。如果您的配置文件包含 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=).*',"`$($env:ComputerName)" | 
Set-Content "C:\test.conf"

如果您确实使用这种方法,我建议您阅读更多有关正则表达式捕获组的内容,以便了解这段代码的作用。

测试和替换不同的参数

使用这种方法来测试逻辑。您可以编辑 @''@ 之间的位以表示配置文件中的值:

$zabbixserver='zabbix123'

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

注意使用 'backtick' 将 -replace 行放在不同的行中