2015-04-15 3 views
0

В настоящее время у меня есть несколько файлов, в которых я использую powershell с надеждой на создание одного выходного файла.Powershell: замените ключевое слово содержимым из txt-файла

У меня есть файл шаблона с ключевыми словами в нем. У меня есть несколько файлов с содержимым, которые находятся в середине шаблона. И у меня есть список для замены.

текстовый файл шаблона:

<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 

Я могу заставить все заменить материал на работу, но я не могу получить содержимое вставного txt-файла t o замените «addfiletexthere».

Как заменить ключевое слово на содержимое существующего текстового файла?

ответ

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 -property, чтобы получить полный дорожка. Пример:

$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>