基于 env 变量更新配置文件的 PowerShell 脚本
PowerShell script to update config file based on env variables
我是 PowerShell 的新手,想在这里完成一些事情:
- 我有一个 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
行放在不同的行中
我是 PowerShell 的新手,想在这里完成一些事情:
- 我有一个 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
行放在不同的行中