我正在尝试使用Windows PowerShell在Windows Server 2008上自动安装Active Directory。我创建了一个扩展名为.tmpl的文本文件并添加了:
[DCINSTALL]
ReplicaOrNewDomain=_ReplicaOrNewDomain__
然后我以文本格式创建了一个答案文件:
[DCINSTALL]
ReplicaOrNewDomain=$env:ReplicaOrNewDomain
现在我希望能够在PowerShell中编写一个脚本,该脚本将使用模板文件从环境中获取变量ReplicaOrNewDomain
的值,并将$env:ReplicaOrNewDomain
替换为文本文件中的该值,以便我可以将该答案文件用于AD安装。
答案 0 :(得分:1)
我喜欢用模板文件做的一件事是这样的。
[DCINSTALL]
ReplicaOrNewDomain={0}
OtherVariable={1}
然后在我的代码中,我可以使用format operator -f
进行更改。
$pathtofile = "C:\temp\test.txt"
(Get-Content $pathtofile -Raw) -f $env:ReplicaOrNewDomain, "FooBar" | Set-Content $pathtofile
如果您有多个需要一次更新的内容,它会有所帮助。根据需要使用尽可能多的占位符更新文件。如果需要,可以多次使用同一个。
[DCINSTALL]
ReplicaOrNewDomain={0}
SimilarVariable={0}
<强>买者强>
如果你的实际文件应该包含大括号,你需要将它们加倍到转义。
答案 1 :(得分:1)
您有几个选项可以做到这一点。一个是Environment.ExpandEnvironmentVariables
。这使用%variable%
语法(而不是$ env:variable),因此如果您只想替换环境变量会更简单:
gc input.tmpl | foreach { [Environment]::ExpandEnvironmentVariables($_) } | sc out.ini
可以通过ExpandString
实现PowerShell表达式的更完整扩展。如果要将实际的PowerShell表达式插入模板,这将更有用:
gc input.tmpl | foreach { $ExecutionContext.InvokeCommand.ExpandString($_) } | sc out.ini
第三个选项类似于使用Invoke-Expression
的自定义模板方案,我实施了here。
答案 2 :(得分:0)
你可以用这样一个简单的替换来做到这一点:
$f = 'C:\path\to\your.txt'
(Get-Content $f -Raw) -replace '\$env:ReplicaOrNewDomain', $env:ReplicaOrNewDomain |
Set-Content $f
或者像这样:
$f = 'C:\path\to\your.txt'
(Get-Content $f -Raw).Replace('$env:ReplicaOrNewDomain', $env:ReplicaOrNewDomain) |
Set-Content $f
请注意,使用-replace
运算符时,您需要转义$
(因为否则它具有特殊含义&#34;字符串结束&#34;)。使用Replace()
方法时,您只需使用单引号来防止在搜索字符串中扩展变量。
但是,为什么用不同的模板参数_ReplicaOrNewDomain__
替换模板参数$env:ReplicaOrNewDomain
的中间步骤呢?如果你只保留前者并用环境变量ReplicaOrNewDomain
的值替换它,那么你会让生活更轻松。
答案 3 :(得分:-1)
您可以使用ExpandString函数like this:
$ExecutionContext.InvokeCommand.ExpandString($TemplVal)
(假设$ TemplVal有模板字符串)。