我是PowerShell的新手,并试图在这里完成一些事情:
- 我有一个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
并将其替换为同样MyComputer
的COMPUTERNAME
变量的值,导致文件没有变化。如果你放一个像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
行放在单独的行上