1

我试图使用Windows PowerShell自动化Windows Server 2008上的Active Directory安装。我创建了一个文本文件.tmpl延伸和补充:从文本文件中的环境中将实际值替换为环境变量的名称

[DCINSTALL] 
ReplicaOrNewDomain=_ReplicaOrNewDomain__ 

然后我创建了一个文本格式的应答文件:

[DCINSTALL] 
ReplicaOrNewDomain=$env:ReplicaOrNewDomain 

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

回答

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操作时,你需要躲避$(因为否则它会有“字符串结尾”的特殊含义)。使用Replace()方法时,您只需使用单引号来防止在搜索字符串中扩展变量。

但是,为什么用不同的模板参数$env:ReplicaOrNewDomain替换模板参数_ReplicaOrNewDomain__的中间步骤?如果您只保留前者并将其替换为环境变量ReplicaOrNewDomain的值,那么您的生活会更轻松。

+0

我明白,你回应我的查询。我刚试过你的方法,那对我很好。但我很少担心是否必须替换多个环境变量。你能帮我解决这个问题吗?谢谢 – samisda1

+0

您可以菊花链形式更换操作。但是,如果您确实有多个替代品,其他解决方案之一可能是针对您的问题的更好解决方案。 –

-1

可以使用ExpandString功能,like this

$ExecutionContext.InvokeCommand.ExpandString($TemplVal) 

(假设$ TemplVal有模板字符串)。

+1

请不要张贴仅链接的答案。如果您参考外部资源,除了链接之外,还要在答案中包含相关部分。 –

+0

给出答案 - 用于这种事情的函数名称,在这种情况下应该足够了。链接是用于细节的。 – majkinetor

+1

你至少应该在你的问题中展示一个例子。如果链接死了某人将不得不谷歌它无论如何 – Matt

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} 

买者

如果你的实际文件应该包含你需要的是逃到他们加倍花括号。

+0

这不是非常可以维护 - 你需要关注指标,你不能做更多的高级东西,比如迭代。 ExpandString是更通用的解决方案,因为您可以注入任何代码(即使是递归)。 – majkinetor

+0

@majkinetor我同意发生率的维持。只要数字不高,并且用户愿意管理它,这仍然可以工作。 – Matt

1

你有几个选择来做到这一点。一个是Environment.ExpandEnvironmentVariables。这将使用%variable%语法(而不是$ ENV:变量),所以它会更简单,如果你只是想替换环境变量:

gc input.tmpl | foreach { [Environment]::ExpandEnvironmentVariables($_) } | sc out.ini 

PowerShell中表达的更完整的扩展可以通过ExpandString来实现。

gc input.tmpl | foreach { $ExecutionContext.InvokeCommand.ExpandString($_) } | sc out.ini 

第三种选择是类似的东西使用Invoke-Expression定制的模板方案,这是我实现here:如果要插入实际的PowerShell表达式插入模板这是比较有用的。