PowerShell脚本基于环境变量更新配置文件

时间:2018-09-16 20:49:20

标签: powershell file-manipulation

我是PowerShell的新手,正在尝试在这里完成几件事:

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

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

./dags

但是此脚本不适用于我,并且我尝试过的其他组合未更改基于(“ $ env:ComputerName”)的主机名的值。

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

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

还没有运气,

任何帮助表示赞赏。

谢谢, 凯瑟琳

1 个答案:

答案 0 :(得分:0)

脚本的问题是它在文件中查找 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=).*',"`$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行放在单独的行上