2009-04-15 9 views

答えて

14

これは最適ではないかもしれませんが、機能します。単にxmlをロードし、ファイルに戻すだけです。 XML見出しは失われてしまいますので、これを再追加する必要があります。

$files = get-ChildItem "*.xml" 
foreach ($file in $files) 
{ 
    [System.Xml.XmlDocument]$doc = new-object System.Xml.XmlDocument; 
    $doc.set_PreserveWhiteSpace($true); 
    $doc.Load($file); 

    $root = $doc.get_DocumentElement(); 
    $xml = $root.get_outerXml(); 
    $xml = '<?xml version="1.0" encoding="utf-8"?>' + $xml 

    $newFile = $file.Name + ".new" 
    Set-Content -Encoding UTF8 $newFile $xml; 
} 
+0

どこかに保存するようにエンコードを明示的に設定するべきではありませんか? – Joey

+0

もし私が知っていたら、私はそうします。それはデフォルトのようです。 –

+0

- エンコードパラメータ。 – JasonMArcher

13

まあ、私は最も簡単な方法は、単にファイルがXMLであるかどうかを気にしないと単純に変換することであると思います。

Get-Content file.foo -Encoding Unicode | Set-Content -Encoding UTF8 newfile.foo 

が存在しない場合にのみ、XMLのために動作します
<?xml version="1.0" encoding="UTF-16"?> 

行。あなたはCreateXmlDeclarationの詳細説明についてはXMLDocumentを見てみたいことがあり

$encoding="UTF-8" # most encoding should work 
$files = get-ChildItem "*.xml" 
foreach ($file in $files) 
{ 
    [xml] $xmlDoc = get-content $file 
    $xmlDoc.xml = $($xmlDoc.CreateXmlDeclaration("1.0",$encoding,"")).Value 
    $xmlDoc.save($file.FullName)  
} 

+4

新しいファイルを作成せずにファイルを作成する場合は、get-contentを括弧で囲むことができます。(Get-Content File.foo)|セットコンテンツ-Encoding UTF8 File.foo – Jaykul

+0

ディレクトリやサブディレクトリ内のファイルに対してこれをどうやって行うのですか? – stormwild

+1

'gci -rec -fi * | %{(gc $ _ -enc unicode)| set-content -enc utf8 $ _。フルネーム} '。かなり簡単です。 – Joey

8

XmlWriterを使用しています。このソリューションをお試しください。

+0

このような短い質問を、技術的に優れた簡潔な答えを提供していただきありがとうございます。 – gimpf

+0

私はそれを完了しなければなりませんでした、そして、私はこの問題を見る前にこの解決策を見つけました。私はそれを提供するのが普通だと感じました。ほとんど努力するだけで誰かがそれを使ってファイルのエンコーディングを変換しながらコピーすることができます。よろしく。 – LMA1980

関連する問題