PowerShell 脚本,用于根据 env 变量更新配置文件



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

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

我的最终目标是拥有一个Powershell脚本,该脚本将根据"$env:ComputerName"更改主机名,而ServerActive是使用给定参数更改HostMetaData,具有给定参数的env变量,可以使用给定cmdlet填充。我开始玩,遇到了以下脚本:

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

但是,此脚本对我不起作用,我尝试过的不同组合不会根据("$env:计算机名"(更改主机名的值。

我找到了另一个建议的选项:

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

还没有运气,

任何帮助表示赞赏。

谢谢 凯瑟 琳

脚本的问题在于它在文件中查找实际的主机名值,然后替换它。如果你的配置文件包含HOSTNAME=MyComputer并且你在名为MyComputer的计算机上运行它,那么它将在文件中查找MyComputer并将其替换为同样MyComputerCOMPUTERNAME变量的值,导致文件没有变化。如果你放一个像Hostname={replace this text}这样的占位符,那么$(Hostname)仍然解析为'MyComputer',而不是{replace this text},替换不会找到或替换任何东西。

要找到Hostname=SOMETHINGELSE并用$env:COMPUTERNAME替换SOMETHINGELSE,需要更多的工作。

正则表达式

这种方法使用-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)"

请注意使用"反引号"将-replace行放在单独的行上

相关内容

  • 没有找到相关文章

最新更新