Powershell:用txt文件中的内容替换关键字

时间:2015-04-15 19:34:10

标签: variables powershell replace

我目前有几个文件,我正在使用PowerShell,希望创建一个输出文件。

我有一个包含关键字的模板文件。 我有几个文件,其内容属于模板的中间。 我列出了我需要更换的内容。

文本文件模板:

<pi.category>
<figure id="fig6"><title>TITLEHERE</title>
<graphic boardno="GRAPHBOARDNO"></graphic>
</figure>
<fncgrp>
<fnccode>FGCCODE</fnccode>
<fnctitle>FGCTITLE</fnctitle>
</fncgrp>ADDFILETEXTHERE</pi.category>

要插入“ADDFILETEXTHERE”的第二个文本文件(可能是这里的任何内容):

<pi.item><callout assocfig="fig1" numref="c1"/><qty>8</qty>
<smr maintcode="FZ" recovercode="Z" sourcecode="PA"/><nsn><fsc>5310</fsc>
<niin>00-763-8921</niin></nsn><partno>MS51967-23</partno><cageno>96906</cageno>
<name>NUT,PLAIN,HEXAGON</name><desc></desc></pi.item>

我的powershell脚本:

$content = [IO.File]::ReadAllText(".\insert.txt")
Get-Content C:\template.xml |
Foreach-Object {$_ -replace "R00000", "R00001"} |
Foreach-Object {$_ -replace "TITLEHERE", "Standard Practices"} |
Foreach-Object {$_ -replace "FGCCODE", "01520"} |
Foreach-Object {$_ -replace "FGCTITLE", "Hydraulic Line Stuff"} |
Foreach-Object {$_ -replace "GRAPHBOARDNO", "AVLBCP0123"} |
Foreach-Object {$_ -replace "ADDFILETEXTHERE", "$content"} |
Set-Content C:\output.xml

我可以使用所有替换内容,但是我无法获取insert txt文件的内容来替换“addfiletexthere”。

如何用现有文本文件的内容替换关键字?

1 个答案:

答案 0 :(得分:0)

这是您的问题(请注意我在PowerShell中的当前工作目录和错误中的路径):

PS C:\Users\Frode\Desktop> $content = [IO.File]::ReadAllText(".\insert.txt")
Exception calling "ReadAllText" with "1" argument(s): "Could not find file 'C:\WINDOWS\system32\insert.txt'."
At line:1 char:1
+ $content = [IO.File]::ReadAllText(".\insert.txt")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FileNotFoundException

当涉及到当前目录时,.NET方法就存在于它自己的世界中。请参阅我之前的回答:Create new absolute path from absolute path + relative or absolute path

您可以在我上面链接的问题中看到解决方案,或者您只需使用Get-Item获取文件的FileInfo - 对象并使用它的FullName - 属性即可得到完整的路径。例如:

$insertFile = Get-Item ".\insert.txt"
$content = [IO.File]::ReadAllText($insertFile.FullName)

#Test
@"
<pi.category>
<figure id="fig6"><title>TITLEHERE</title>
<graphic boardno="GRAPHBOARDNO"></graphic>
</figure>
<fncgrp>
<fnccode>FGCCODE</fnccode>
<fnctitle>FGCTITLE</fnctitle>
</fncgrp>ADDFILETEXTHERE</pi.category>
"@ -split [System.Environment]::NewLine | 
Foreach-Object {$_ -replace "R00000", "R00001"} |
Foreach-Object {$_ -replace "TITLEHERE", "Standard Practices"} |
Foreach-Object {$_ -replace "FGCCODE", "01520"} |
Foreach-Object {$_ -replace "FGCTITLE", "Hydraulic Line Stuff"} |
Foreach-Object {$_ -replace "GRAPHBOARDNO", "AVLBCP0123"} |
Foreach-Object {$_ -replace "ADDFILETEXTHERE", "$content"}

#Output
<pi.category>
<figure id="fig6"><title>Standard Practices</title>
<graphic boardno="AVLBCP0123"></graphic>
</figure>
<fncgrp>
<fnccode>01520</fnccode>
<fnctitle>Hydraulic Line Stuff</fnctitle>
</fncgrp><pi.item><callout assocfig="fig1" numref="c1"/><qty>8</qty>
<smr maintcode="FZ" recovercode="Z" sourcecode="PA"/><nsn><fsc>5310</fsc>
<niin>00-763-8921</niin></nsn><partno>MS51967-23</partno><cageno>96906</cageno>
<name>NUT,PLAIN,HEXAGON</name><desc></desc></pi.item></pi.category>