12

私は非常に単純なことをしようとしています.BOMなしでファイルのエンコーディングを何かからUTF-8に変更することです. これを行うスクリプトをいくつか見つけましたが、実際に機能したのはこれだけです。回答-397915 .

期待どおりに機能しましたが、BOM なしで生成されたファイルが必要です。そこで、この質問に与えられた解決策を追加して、スクリプトを少し変更しようとしました: PowerShell を使用して BOM なしで UTF-8 でファイルを書き込む

これは私の最終的なスクリプトです:

foreach ($i in Get-ChildItem -Recurse) {
    if ($i.PSIsContainer) {
        continue
    }

    $dest = $i.Fullname.Replace($PWD, "some_folder")

    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)

    if (!(Test-Path $(Split-Path $dest -Parent))) {
        New-Item $(Split-Path $dest -Parent) -type Directory
    }

    get-content $i | out-file -encoding $Utf8NoBomEncoding -filepath $dest
}

問題は、PowerShell がSystem.Text.UTF8Encoding($False)行に関して、間違ったパラメーターについて不平を言うエラーを返していることです。

'Encoding' パラメーターの引数を検証することはできません。引数「System.Text.UTF8Encoding」は、ValidateSet 属性で指定されたグループ「unicode、utf7、utf8、utf32、ascii」に属していません。

powershell のバージョンなど、何か不足しているのではないかと思います。これまで Powershell スクリプトをコーディングしたことがなかったので、これで完全に迷ってしまいました。そして、これらのファイルのエンコーディングを変更する必要があります。何百ものファイルがあり、1 つずつ自分でやりたくありません。

実際に私は Windows 7 に付属している 2.0 バージョンを使用しています。

前もって感謝します!

編集1

@LarsTruijens および他の投稿で提案された次のコードを試しました。

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach ($i in Get-ChildItem -Recurse) {
    if ($i.PSIsContainer) {
        continue
    }

    $dest = $i.Fullname.Replace($PWD, "some_folder")

    if (!(Test-Path $(Split-Path $dest -Parent))) {
        New-Item $(Split-Path $dest -Parent) -type Directory
    }

    $content = get-content $i
    [System.IO.File]::WriteAllLines($dest, $content, $Utf8NoBomEncoding)
}

これにより、 WriteAllLines: のパラメーターの 1 つについて不平を言う例外が発生します"Exception on calling 'WriteAllLines' with 3 arguments. The value can't be null". Parameter name: contents。ただし、スクリプトはすべてのフォルダーを作成します。しかし、それらはすべて空です。

編集2

このエラーの興味深い点は、"content" パラメーターが null ではないことです。$content 変数の値を (Write-host を使用して) 出力すると、行が表示されます。では、なぜ WriteAllLines メソッドに渡すと null になるのでしょうか?

編集3

変数にコンテンツ チェックを追加したので、スクリプトは次のようになります。

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach ($i in Get-ChildItem -Recurse) {
    if ($i.PSIsContainer) {
        continue
    }

    $dest = $i.Fullname.Replace($PWD, "some_folder")

    if (!(Test-Path $(Split-Path $dest -Parent))) {
        New-Item $(Split-Path $dest -Parent) -type Directory
    }

    $content = get-content $i

    if ( $content -ne $null ) {

        [System.IO.File]::WriteAllLines($dest, $content, $Utf8NoBomEncoding)
    }
    else {
        Write-Host "No content from: $i"
    }
}

現在、すべての反復で「No content from: $i」メッセージが返されますが、ファイルは空ではありません。もう 1 つエラーがありGet-content: can't find the path 'C:\root\FILENAME.php' because it doesn't exists.ます。サブフォルダーではなく、ルート ディレクトリでファイルを検索しようとしているようです。子フォルダーからファイル名を取得できるように見えますが、ルートから読み取ろうとします。

EDIT 4 - 最終作業バージョン

特に@LarsTruijensと@AnsgarWiechersから、ここで得たアドバイスに苦労して従った後、ようやく成功しました。$PWD からディレクトリを取得する方法を変更し、フォルダにいくつかの固定名を設定する必要がありました。その後、それは完全に機能しました。

興味があるかもしれない人のために、ここに行きます:

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
$source = "path"
$destination = "some_folder"

foreach ($i in Get-ChildItem -Recurse -Force) {
    if ($i.PSIsContainer) {
        continue
    }

    $path = $i.DirectoryName -replace $source, $destination
    $name = $i.Fullname -replace $source, $destination

    if ( !(Test-Path $path) ) {
        New-Item -Path $path -ItemType directory
    }

    $content = get-content $i.Fullname

    if ( $content -ne $null ) {

        [System.IO.File]::WriteAllLines($name, $content, $Utf8NoBomEncoding)
    } else {
        Write-Host "No content from: $i"   
    }
}
4

7 に答える 7

3

あなたはここの答え全体に従わなかった. WriteAllLines の部分を忘れました。

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach ($i in Get-ChildItem -Recurse) {
    if ($i.PSIsContainer) {
        continue
    }

    $dest = $i.Fullname.Replace($PWD, "some_folder")

    if (!(Test-Path $(Split-Path $dest -Parent))) {
        New-Item $(Split-Path $dest -Parent) -type Directory
    }

    $content = get-content $i 
    [System.IO.File]::WriteAllLines($dest, $content, $Utf8NoBomEncoding)
}
于 2013-09-09T19:37:28.007 に答える
2

答えの半分はエラーメッセージにあります。Encoding パラメーターが受け入れる可能な値を示します。そのうちの 1 つは utf8 です。

... out-file -encoding utf8
于 2013-09-08T14:41:26.767 に答える
-1

と:

 foreach ($i in Get-ChildItem -Path $source -Recurse -Force) {

サブフォルダー内のファイルのみ$sourceが使用されます。

于 2016-01-28T11:43:52.623 に答える