PowerShell - Batch-Dateien ändern Codierung Auf UTF-8

Ich versuche zu tun, eine tote einfache Sache: um die Dateien ändern Codierung von nichts zu UTF-8 ohne BOM. Ich habe mehrere Skripte, die dies tun, und die einzige, die wirklich für mich gearbeitet ist: https://superuser.com/questions/397890/convert-text-files-recursively-to-utf-8-in-powershell#answer-397915.

Es funktionierte wie erwartet, aber ich muss die generierten Dateien ohne BOM. So habe ich versucht, ändern Sie das Skript ein wenig, indem die Lösung auf diese Frage: Mit PowerShell zu schreiben, eine Datei in UTF-8 ohne BOM

Dies ist meine Letzte Skript:

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
}

Das problem ist, dass powershell ist wieder in mir einen Fehler, bezüglich der System.Text.UTF8Encoding($False) Linie, die sich über einen falschen parameter:

Es ist nicht möglich, zu überprüfen das argument der 'Encoding' parameter. Das argument " - System.Text.Bei UTF8Encoding" dont gehört zu der der Gruppe "unicode", "utf7", "utf8, utf32", "ascii" angegeben, die von der ValidateSet Attribut.

Frage ich mich, ob ich etwas fehlt, wie powershell-version oder sowas. Ich habe nie codiert ein Powershell-Skript vor, und so bin ich völlig verloren mit dieser. Und ich brauche zu ändern, diese Dateien zu Kodieren, es gibt Hunderte von Ihnen, ich möchte nicht, es selbst zu tun eins nach dem anderen.

Eigentlich bin ich mit der version 2.0 kommt mit Windows 7.

Vielen Dank im Voraus!

BEARBEITEN 1

Habe ich versucht den folgenden code, vorgeschlagen von @LarsTruijens und andere Beiträge:

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

Dieser gibt mir eine Ausnahme, beschweren sich über einen der Parameter für WriteAllLines: "Exception on calling 'WriteAllLines' with 3 arguments. The value can't be null". Parameter name: contents. Das Skript erstellt alle Ordner, aber. Aber Sie sind alle leer.

EDIT 2

Eine interessante Sache über dieses Fehlers ist, dass der "Inhalt" - parameter nicht null ist. Wenn ich die Ausgabe der Wert der $content-variable (mit Write-host) die Linien sind da. Warum also es wird null, wenn die übergebene Methode WriteAllLines?

EDIT 3

Habe ich eine inhaltliche Prüfung auf die variable, also das script sieht jetzt wie folgt aus:

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

Nun jeder iteration gibt "Keinen Inhalt aus: $i" angezeigt, aber die Datei ist nicht leer. Es ist noch ein Fehler: Get-content: can't find the path 'C:\root\FILENAME.php' because it doesn't exists. Es scheint, dass es versucht, zu finden die Dateien im root-Verzeichnis und nicht in den Unterordnern. Es scheint in der Lage zu Holen Sie sich die Dateinamen von untergeordneten Ordnern, sondern versucht, es zu Lesen von der Wurzel.

BEARBEITEN 4 - Endgültige Version

Nach einigen kämpfen und die folgenden Ratschläge, die ich hier bekam, speziell von @LarsTruijens und @AnsgarWiechers, habe ich es endlich geschafft. Ich hatte auf die Art und Weise ändern, ich war immer das Verzeichnis $PWD und einen festen Namen für den Ordner ein. Danach funktionierte es perfekt.

Geht es hier, für alle, die interessiert sein könnten:

$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"   
    }
}
  • möglich, Duplikat der Mit PowerShell zu schreiben, eine Datei in UTF-8 ohne BOM. Was machte Sie glauben, dass Out-File und [System.IO.File]::WriteAllLines() waren die gleichen? Sie sind es nicht.
  • Über diesen link, den Sie eingefügt werden, das habe ich versucht und es hat nicht für mich gearbeitet. Wie ich schon sagte, ich bin kein PowerShell-Programmierer und weiß nichts über es. Also ich weiß nicht, den Unterschied zwischen diesen beiden Methoden/Funktionen und das ist, warum ich bin auf der Suche nach spezialisierten Hilfe.
  • Getestet habe ich den code aus, die andere Antwort, und es tut genau das, was Sie gesagt haben, Sie wollen. Bitte aktualisieren Sie Ihre Frage mit dem code, wo Sie verwendet werden [System.IO.File]::WriteAllLines().
  • Ich habe aktualisiert die Frage!
  • Bitte überprüfen Sie, ob $content ist wirklich nicht $null für alle Iterationen. Probieren Sie etwas wie dieses: if ($content -ne $null) { [System.IO.File]::WriteAllLines($dest, $content, $Utf8NoBomEncoding) } else { Write-Host "no content from $i" }.
  • Thnx, @AnsgarWiechers Die Frage ist aktualisiert mit neuen Infos nach den änderungen, die Sie vorgeschlagen.
  • $i erweitert, um nur den Dateinamen ohne den Pfad. Versuchen Get-Content $i.FullName.
  • Ich glaube, dass Sie nicht die richtige Folge wie Sie Dateien Lesen, Inhalt mit dem default-encoding: $Inhalt = get-content $ich.Fullname get-content standardmäßig verwendet die Ascii-Codierung, so dass, wenn eine Datei bereits im utf-8-das Skript wird zu brechen-Codierung.

InformationsquelleAutor darksoulsong | 2013-09-08
Schreibe einen Kommentar