将环境变量的名称替换为文本文件中环境的实际值

时间:2015-05-25 13:09:05

标签: powershell active-directory automation environment-variables silent-installer

我正在尝试使用Windows PowerShell在Windows Server 2008上自动安装Active Directory。我创建了一个扩展名为.tmpl的文本文件并添加了:

[DCINSTALL]
ReplicaOrNewDomain=_ReplicaOrNewDomain__

然后我以文本格式创建了一个答案文件:

[DCINSTALL]
ReplicaOrNewDomain=$env:ReplicaOrNewDomain

现在我希望能够在PowerShell中编写一个脚本,该脚本将使用模板文件从环境中获取变量ReplicaOrNewDomain的值,并将$env:ReplicaOrNewDomain替换为文本文件中的该值,以便我可以将该答案文件用于AD安装。

4 个答案:

答案 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有模板字符串)。