2013-10-15 7 views
6

Ich führe das folgende PowerShell-Skript aus, um eine Reihe von Ausgabedateien in einer einzigen CSV-Datei zu verketten. whidataXX.htm (wobei xx eine zweistellige fortlaufende Nummer ist) und die Anzahl der erstellten Dateien variiert von Lauf zu Lauf.Warum konvertiert die Powershell-Dateiverkettung UTF8 in UTF16?

$metadataPath = "\\ServerPath\foo" 

function concatenateMetadata { 
    $cFile = $metadataPath + "whiconcat.csv" 
    Clear-Content $cFile 
    $metadataFiles = gci $metadataPath 
    $iterations = $metadataFiles.Count 
    for ($i=0;$i -le $iterations-1;$i++) { 
     $iFile = "whidata"+$i+".htm" 
     $FileExists = (Test-Path $metadataPath$iFile -PathType Leaf) 
     if (!($FileExists)) 
     { 
      break 
     } 
     elseif ($FileExists) 
     { 
      Write-Host "Adding " $metadataPath$iFile 
      Get-Content $metadataPath$iFile | Out-File $cFile -append 
      Write-Host "to" $cfile 
     } 
    } 
} 

Die whidataXX.htm Dateien werden verschlüsselt UTF8, aber meine Ausgabedatei wird UTF16 codiert. Wenn ich die Datei in Editor anzeigen, scheint es korrekt, aber wenn ich es in einem Hex-Editor anzeigen, erscheint der Hex-Wert 00 zwischen jedem Zeichen, und wenn ich die Datei in ein Java-Programm zur Verarbeitung ziehen, wird die Datei auf der Konsole gedruckt mit zusätzlichen Leerzeichen zwischen c h a r a c t e r s.

Erstens, ist das normal für PowerShell? oder gibt es etwas in den Quelldateien, das dies verursachen würde?

Zweitens, wie würde ich dieses Codierungsproblem in dem oben genannten Code beheben?

Antwort

12

Die Out-* Cmdlets (wie Out-File) formatieren die Daten und das Standardformat ist Unicode.

Sie können einen -Encoding Parameter Out-Datei hinzufügen:

Get-Content $metadataPath$iFile | Out-File $cFile -Encoding UTF8 -append 

oder wechseln Sie Add-Content, der nicht

Get-Content $metadataPath$iFile | Add-Content $cFile 
+0

Und um zu bestätigen, fügt Add-Content einfach die neuen Daten an die vorhandene Datei an, richtig? – dwwilson66

+0

Ja. Sein Gegenstück Set-Content überschreibt die vorhandenen Daten. – mjolinor

2

Erstens ist die Tatsache, dass Sie nicht-Format wieder get 2 bytes pro Zeichen gibt an, dass UTF16 mit fester Länge verwendet wird. Genauer gesagt heißt es UCS-2. In diesem Artikel wird erläutert, dass bei der Dateiumleitung in Powershell die Ausgabe in UCS-2 erfolgt. Siehe http://www.kongsli.net/nblog/2012/04/20/powershell-gotchas-redirect-to-file-encodes-in-unicode/. Derselbe Artikel bietet auch eine Lösung.

+0

Danke für die Artikelreferenz! – dwwilson66

Verwandte Themen