私は非常に単純なことをしようとしています.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"
}
}