2016-07-20 4 views
-1

ソースファイルを読み込んで特定の文字を新しいものに置き換える既存のスクリプトがあります。だからかなりハードにコード化されています。Powershell - 置換操作の参照としてCSVを使用する

(Get-Content $path\$xml_out) | Foreach-Object {$_ -replace '<ContactCode>PROP</ContactCode>','<ContactCode>OFFICE</ContactCode>'} | set-content $path\$xml_out 

私がしたいのは、古い値と新しい値をCSVファイル(わずか2列)に保存して、ユーザーがアドホックに変更できるようにすることです。 CSVはこのようになります

ORGIGINAL_CODE,NEW_CODE 
CAREHOME,OFFICE 
PROP,EMERG 
MAIN,OFFICE 
DAY,OFFICE 
TELE,TEL 
BUSINESS,OFFICE 

これは私が置き換えを行っている元のファイルです。

CAREHOME 
PROP 
MAIN 
DAY 
TELE 
BUSINESS 

私はimport-csvを使用していますが、内部にGet-Contentを含むForEachループを使用しようとしています。

$testcsv = import-csv $path\mapping.csv 
ForEach ($row in $testcsv) 
{ 
    $field1 = $row.ORGIGINAL_CODE 
    $field2 = $row.NEW_CODE 
    Echo "$field1 maps to $field2" 
    echo "$xml_out" 
    (Get-Content $path\$xml_out) | Foreach-Object {$_ -replace '$field1','$field2'} | set-content $path\$xml_out 
} 

は、ソースファイル内のフィールド2とフィールド1の交換が、それはちょうど私のコード

$_ -replace $field1,$field2 
$_ -replace $field1,$field2 
$_ -replace $field1,$field2 
$_ -replace $field1,$field2 
$_ -replace $field1,$field2 
$_ -replace $field1,$field2 
$_ -replace $field1,$field2 

私は

OFFICE 
EMERG 
OFFICE 
OFFICE 
TEL 
OFFICE 

で終わることを期待されたが入れているので、代わりの私は、私はと思われます正しくエスケープしないでください。

+1

あなたが言いました「苦情」をそのままご記入ください。また、[mcve]を提供してください。上のスニペットの変数の多くは表示されません( '$ CSV'、' $ path'など)。 – gravity

+0

オリジナルの編集では、あなたが見る出力を与える 'ForEach'ループの中にスクリプトブロックがネストされています。 'Foreach-Object {{$ _ -replace '$ field1'、 '$ field2'}}'となります。それはあなたの問題の原因で私の推測です - それはちょうどセットコンテンツでファイルにscriptblockを書いていた。これであなたの編集で間違いを修正しました。私はあなたのコードがこれ以上同じ問題を起こさないだろうと思っています...? – TessellatingHeckler

答えて

0

ループの最後で配列を処理して出力する方が簡単かもしれません。

$testcsv = Import-Csv $path\mapping.csv 
$XmlIn = Get-Content $path\Scripts\XML.txt 
foreach ($row in $testcsv) 
{ 
    $field1 = $row.ORGIGINAL_CODE 
    $field2 = $row.NEW_CODE 
    Write-Host "$field1 maps to $field2" 
    $XmlIn = $XmlIn.Replace($field1,$field2) 
} 
$XmlIn | Out-File $path\XML.txt 
+0

交換部分が私のために働かなかったので、私はその行を微調整しなければなりませんでした。 $ testcsv =インポートCSV $パス\ mapping.csv $ XmlIn =取得、コンテンツ$パス\ source.txt foreachの($のtestcsvの$行) {$ FIELD1 = $ row.ORIGINAL_CODE $ FIELD2 = $ row.NEW_CODE Write-Host "$ field1は$ field2にマップ" $ XmlIn = $ XmlIn | Foreach-Object {$ _ -replace $ field1、$ field2} \t } $ XmlIn | Out-File $ path \ source2.txt – zoomzoomvince

関連する問題