PowerShell - Lot de modifier les fichiers De l'encodage UTF-8

Je suis en train de faire un simple morts chose: pour modifier les fichiers d'encodage à partir de rien pour l'UTF-8 sans BOM. J'ai trouvé plusieurs scripts qui font cela, et le seul qui a vraiment travaillé pour moi, c'est celui-ci: https://superuser.com/questions/397890/convert-text-files-recursively-to-utf-8-in-powershell#answer-397915.

Il a fonctionné comme prévu, mais j'ai besoin des fichiers générés sans BOM. J'ai donc essayé de modifier le script un peu, l'ajout de la solution donnée à cette question: À l'aide de PowerShell pour écrire un fichier en UTF-8 sans BOM

C'est mon script final:

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
}

Le problème est que powershell est de retour moi une erreur, au sujet de la System.Text.UTF8Encoding($False) ligne, se plaindre d'un paramètre incorrect:

Il n'est pas possible de valider l'argument sur le "Encodage" du paramètre. L'argument "du Système.Texte.UTF8Encoding" n'appartient à la le groupe "unicode, utf7, utf8, utf32, ascii" spécifié par le ValidateSet attribut.

Je me demande si je suis absent quelque chose, comme powershell version ou quelque chose comme ça. Je n'ai jamais codé un script Powershell avant, donc je suis totalement perdu avec cette. Et j'ai besoin de modifier ces fichiers d'encodage, il y a des centaines d'entre eux, je ne voudrais pas le faire moi-même un par un.

En fait, je suis en utilisant la version 2.0 qui est livré avec Windows 7.

Merci d'avance!

EDIT 1

J'ai essayé le code suivant, proposé par @LarsTruijens et autres postes:

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

Cela me donne une Exception, se plaindre d'un des paramètres de la WriteAllLines: "Exception on calling 'WriteAllLines' with 3 arguments. The value can't be null". Parameter name: contents. Le script crée tous les dossiers. Mais ils sont tous vides.

EDIT 2

Une chose intéressante à propos de cette erreur est que le "contenu" paramètre n'est pas null. Si j'ai sortie la valeur de l' $contenu variable (en utilisant Write-host), les lignes sont là. Alors pourquoi il devient nulle lorsqu'il est passé à WriteAllLines méthode?

MODIFIER 3

J'ai ajouté le contenu de la case de la variable, de sorte que le script ressemble maintenant à ceci:

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

Maintenant, à chaque itération renvoie "Pas de contenu à partir de: $i" le message, mais le fichier n'est pas vide. Il y a encore une erreur: Get-content: can't find the path 'C:\root\FILENAME.php' because it doesn't exists. Il semble que c'est en essayant de trouver les fichiers dans le répertoire racine et pas dans les sous-dossiers. Il semble être en mesure d'obtenir le nom de fichier de dossiers enfant, mais tente de lire à partir de la racine.

EDITION 4 - Final-Version de Travail

Après quelques difficultés et suivant les conseils que j'ai obtenu ici, spécialement à partir de @LarsTruijens et @AnsgarWiechers, j'ai finalement réussi. J'ai dû changer la façon dont j'ai été d'obtenir le répertoire à partir de $PWD et certains noms fixes pour les dossiers. Après cela, il a parfaitement fonctionné.

Ici que ça se passe, pour toute personne qui pourrait être intéressée:

$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"   
    }
}
double possible de à l'Aide de PowerShell pour écrire un fichier en UTF-8 sans BOM. Ce que vous a fait croire Out-File et [System.IO.File]::WriteAllLines() étaient les mêmes? Ils ne sont pas.
Sur ce lien vous venez de coller, j'ai essayé et ça n'a pas fonctionné pour moi. Comme je l'ai dit, je ne suis pas un PowerShell programmeur, et je ne sais rien à ce sujet. Donc je ne sais pas la différence entre ces deux méthodes/fonctions et c'est pourquoi je suis à la recherche d'une aide spécialisée.
J'ai testé le code que répondre, et il fait exactement ce que vous avez dit que vous voulez. Veuillez mettre à jour votre question avec le code où vous avez utilisé [System.IO.File]::WriteAllLines().
J'ai mis à jour la question!
Merci de vérifier si $content est vraiment pas $null pour tous itérations. Essayez quelque chose comme ceci: if ($content -ne $null) { [System.IO.File]::WriteAllLines($dest, $content, $Utf8NoBomEncoding) } else { Write-Host "no content from $i" }.

OriginalL'auteur darksoulsong | 2013-09-08