2016-07-20 15 views
-1

Ich habe ein vorhandenes Skript, das eine Quelldatei einliest und bestimmte Zeichen durch neue ersetzt. Es ist also ziemlich hart codiert.Powershell - CSV als Nachschlagevorgang für den Ersetzungsvorgang verwenden

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

Was würde ich tun möchte, sind Speicher alte und neue Werte in einer CSV-Datei (nur 2 Spalten), so dass Benutzer können Ad-hoc-Änderungen vornehmen. So sieht meine CSV so aus

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

Und das ist die Originaldatei, die ich ersetze auf.

Ich benutze import-csv aber versuche eine ForEach-Schleife mit einem Get-Content darin zu verwenden.

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

Also anstatt sie zu ersetzen field1 mit field2 in der Quelldatei es nur meinen Code setzt

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

Ich habe gehofft, mit am Ende

OFFICE 
EMERG 
OFFICE 
OFFICE 
TEL 
OFFICE 

Ich vermute, dass ich bin nicht richtig entkommen.

+1

Bitte teilen Sie uns die "Beschwerde", die Sie erwähnt haben, wörtlich mit. Bitte stellen Sie auch ein [mcve] bereit, da viele der Variablen in Ihrem Code oben nicht sichtbar sind ('$ CSV',' $ path', etc.). – gravity

+0

Ich bemerke, dass Sie in Ihrer ursprünglichen Bearbeitung einen Skriptblock innerhalb Ihrer 'ForEach'-Schleife verschachtelt haben, was die Ausgabe ergibt, die Sie sehen. 'Foreach-Objekt {{$ _ -replace '$ field1', '$ field2'}}'. Das ist meine Vermutung für die Ursache Ihres Problems - es hat nur den Skriptblock mit Set-Content in die Datei geschrieben. Jetzt haben Sie diesen Fehler in Ihrer Bearbeitung korrigiert, ich wette, Ihr Code wird das gleiche Problem nicht mehr geben ...?. – TessellatingHeckler

Antwort

0

Ich könnte leichter am Array arbeiten und am Ende der Schleife ausgeben.

$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

Der Ersetzungsteil funktionierte nicht für mich, also musste ich diese Zeile optimieren und es funktioniert jetzt perfekt. testcsv $ = Import-Csv $ path \ mapping.csv $ XMLin = Get-Content $ path \ source.txt foreach ($ row in $ testcsv) { $ field1 = $ row.ORIGINAL_CODE $ field2 = $ row.NEW_CODE Write-Host "$ field1 mappt $ field2" $ XmlIn = $ XmlIn | Foreach-Objekt {$ _ -replace $ field1, $ field2} \t } $ XmlIn | Out-Datei $ path \ source2.txt – zoomzoomvince