我是PowerShell的新手,正在尝试在这里完成几件事:
我的最终目标是拥有一个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
还没有运气,
任何帮助表示赞赏。
谢谢, 凯瑟琳
答案 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
行放在单独的行上