none
Datei nach UTF-8 codieren und im Anschluss löschen RRS feed

  • Frage

  • Guten Morgen,

    ich möchte mit einem Powershell Script bestehende txt-Dateien nach UTF-8 codieren, das mache ich mit diesem Script:

    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" }

    Damit wird die txt-Datei nach UTF-8 codiert und unter dem bisherigen Dateinamen+"-UTF8".txt im selben Verzeichnis gespeichert.

    Nun würde ich gerne noch die ursprüngliche (bereits verarbeitete) Datei (-> ChildItem) löschen. Da sich im Verzeichnis mehrere txt-Dateien befinden können, die ggf. noch nicht umkodiert wurden, kann nicht einfach der gesamte Verzeichnisinhalt gelöscht werden.

    Für Eure Unterstützung bereits jetzt besten Dank!

    Dienstag, 14. Januar 2020 06:50

Antworten

  • $datei = Get-ChildItem *.idx | % { Get-Content $datei | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx" | Remove-Item $datei -force }

    Get-ChildItem *.idx | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx"; Remove-Item $_ -force }
    
    
    
    



    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Mittwoch, 15. Januar 2020 14:11

Alle Antworten

  • Moin,

    dann lösch sie doch, was ist das Problem? Im Scriptblock des Foreach-Object können ja mehrere Anweisungen, durch Semikolon oder Zeilenwechsel getrennt, stehen. Die Datei ist ja in $_ gespeichert.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Dienstag, 14. Januar 2020 07:29
  • Hallo Evgenij,

    danke.

    Ich würde allerdings nicht fragen, wenn ich die Syntax selbst aufbauen könnte :-)

    Dienstag, 14. Januar 2020 07:36
  • Hi,

    du pipest etwas an foreach. Wie Evgenij schon sage, kannst du doch nach dem erstellen der neuen Datei den Inhalt der pipe beliebig weiter verarbeiten. Wie man eine Datei löscht, dass sagt dir Tante google.

    Übrigens, so wie du deine Umformatierung aufgebaut hast, wird nicht eine .txt umformatiert und unter "alter-name-UTF8.txt" abgespeichert, sondern dass macht er mit allen .txt Dateien, die in deinem Verzeichnis sind.

    Wenn du also die neuen, umformatierten .txts im selben Verzeichnis stehen lässt, wird er sie jedes mal wieder durch die Schleife schicken, eine neue Datei erzeugen und "-UTF8.txt" dran hängen, wenn du das Skript laufen lässt. 

    Heißt, wenn du das löschen implementiert hast, startest mit:
    "nichtUTF8.txt"

    beim ersten lauf wird dann daraus:

    "nichtUTF8-UTF8.txt"
    beim zweiten lauf wird dann daraus:

    "nichtUTF8-UTF8-UTF8.txt"

    beim dritten:
    "nichtUTF8-UTF8-UTF8-UTF8.txt"

    Und so weiter.

    das nur als Hinweis. Daher würde ich empfehlen, die neuen Dateien entweder in ein neues Verzeichnis zu verschieben, oder deinen Suchfilter so anzupassen, dass du nur nicht umformatierte Dateien als Ergebnis erhälst.

    Auf .txt matched halt alles.

    Gruß

    Dienstag, 14. Januar 2020 09:34
  • du pipest etwas an foreach. Wie Evgenij schon sage, kannst du doch nach dem erstellen der neuen Datei den Inhalt der pipe beliebig weiter verarbeiten. Wie man eine Datei löscht, dass sagt dir Tante google.

    Danke. Wie ich bereits sagte - wenn ich's hinbekommen hätte, hätte ich nicht danach gefragt.

    Den Hinweis mit der Schleife nehme ich dankbar an, die Ergebnisdaten werden bereits in einem anderen Verzeichnis abgelegt. Den Pfad dazu habe ich in meinem Post bewusst herausgenommen

    Dienstag, 14. Januar 2020 10:18
  • Ich formatiere Deinen Code mal anders, vielleicht kommst Du dann selber drauf :-)

    Get-ChildItem *.txt | % { 
        Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" 
    }

    Edit: Der Hinweis auf immer wieder erneute Verarbeitung der gleichen Dateien ist korrekt, da muß noch ein

    ? { $_.Name -notmatch '.*-UTF8.TXT$' }
    oder vergleichbares in die Pipeline eingebaut werden.
    Dienstag, 14. Januar 2020 16:45
  • nein, sorry. Ich krieg's nicht hin.

    Ich versuchs am Fremdsystem zu lösen in dem ich die Daten bereits UTF-8 codiert anliefere. Das im trüben fischen dauert mir zu lange, Powershell ist nicht mein Thema


    • Bearbeitet Andi Ärr Mittwoch, 15. Januar 2020 07:26
    Mittwoch, 15. Januar 2020 07:25
  • Dieses Forum ist eben nicht dafür da, Träume, Wünsche und Gesuche zu erfüllen. Das lernen und verstehen wollen wir dir nicht abnehmen.

    Dateien mit Powershell löschen

    Gruß

    Mittwoch, 15. Januar 2020 07:39
  • Schon okay, alles in Ordnung. Wie man google benutzt ist mir schon bewusst, danke dafür.

    Trotzdem komm' ich mit der Syntax von Powershell nicht klar und bekomme die Befehle nicht kombiniert. Ist doch aber schön wenn ihr's könnt - da bricht mir keiner ab :-)

    Mittwoch, 15. Januar 2020 07:55
  • Es geht hier nicht um Information Hiding, oder um blaming.
    Wenn du deine versuche postet, zeigen wir dir die Fehler auf und helfen dabei, den Code zu verstehen. Eine Sprache lernt man eben nicht in 5 Minuten.

    Der einfachste Weg wäre z.B.

    Die Suche erst in eine Variable zu übergeben.

    Dann kannst du einmal den Inhalt der Variable in deiner Schleife verarbeiten und dann in einem zweiten Schritt den Inhalt der selben Variable löschen. Ganz einfach sequenziell hinter einander.

    remove-item nimmt Objekte aus der pipeline an.

    Also

    $variable | remove-item


    Der schönere Weg wäre dann, das Löschen mit in die Schleife einzubauen. Wie man das macht, hat Evgenij in seinem Post beschrieben.

    Gruß

    Mittwoch, 15. Januar 2020 08:28
  • Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" }; Remove-Item $_
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" }; Remove-Item
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } | ForEach-Object Remove-Item
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach-Object Remove-Item
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach-Object $_ Remove-Item
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach $_ Remove-Item
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; Remove-Item _$
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach-Object {$_.RemoveItem}
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } | ForEach-Object {$_.RemoveItem}
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" }
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } | ForEach-Object {$_.RemoveItem}
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" }
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } | ForEach-Object {$_.RemoveItem}
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach-Object {$_.RemoveItem}
    
    Get-ChildItem *.txt | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.txt" } ; ForEach-Object RemoveItem

    es gab da dein ein oder anderen Versuch, ja - das ist die Powershell-History
    Mittwoch, 15. Januar 2020 08:39
  • % ist ein alias für foreach. Alles in den geschweiften Klammern ist der Skriptblock der ForEach Schleife.
    Das Löschen muss in den Scriptblock der Schleife mit rein. 

    Was du da versucht hast, ist eine neue ForEach Schleife zu öffnen.

    Gruß

    Mittwoch, 15. Januar 2020 09:27
  • $datei = Get-ChildItem *.idx | % { Get-Content $datei | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx" | Remove-Item $datei -force }

    Get-Content : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.

    das war jetzt mein letzter Versuch, ich kann nicht noch mehr Zeit damit verbrauchen und konzentriere mich auf's Fremdsystem was die Daten anliefert.

    Mittwoch, 15. Januar 2020 10:28
  • $datei = Get-ChildItem *.idx | % { Get-Content $datei | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx" | Remove-Item $datei -force }

    Get-ChildItem *.idx | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx"; Remove-Item $_ -force }
    
    
    
    



    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Mittwoch, 15. Januar 2020 14:11

  • Get-ChildItem *.idx | % { Get-Content $_ | Out-File -Encoding UTF8 "$($_.basename)-UTF8.idx"; Remove-Item $_ -force }
    
    

    Siehe auch meine allererste Antwort ;-)

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 15. Januar 2020 17:17