So kombinieren Sie Dateiinhalte in PowerShell. Und nicht leiden

Was musste getan werden?


Einmal musste ich eine Reihe von Textdateien, die in einem Verzeichnis lagen, in einer Datei kombinieren. Ich wollte das nicht mit meinen Händen machen und Google kam mir wie immer zu Hilfe! Ich habe viel über die Leistungsfähigkeit eines Tools wie PowerShell gehört und beschlossen, es für diese "Mega-Aufgabe" zu verwenden. Zumindest, weil ich mit dem Elend von cmd.exe nicht vertraut bin. Nun, es mit deinen Händen zu tun ist nicht unser Weg.


Was ist schief gelaufen?


Google hat mir gesagt, dass Sie dies mit einem einfachen Befehl tun können


Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

"Wirklich cool! Nur eine Art Unix-Weg!" Dachte ich. Ich habe den Befehl kopiert, leicht geändert und die Eingabetaste gedrückt. Der Cursor bewegte sich in eine neue Zeile ... und nichts weiter. Im Dateimanager habe ich die endgültige Datei geöffnet - es war wirklich etwas Ähnliches wie das gewünschte Ergebnis. Es hatte viele Zeilen aus den Quelldateien. Als ich zur Konsole zurückkehrte, sah ich, dass der Prozess noch ... im Prozess ist. Hat Strg + C geholfen .


Bei näherer Betrachtung der Dateigröße stellte ich fest, dass sie irgendwie verdächtig groß war. Seine Größe überschritt 100 Megabyte. Obwohl die Wasserdaten nicht so groß waren.


Warum ist das passiert?


Es geht nur um meine "einfache Modifikation". Ich brauchte nur keinen Erweiterungsfilter. Ja, und dieser Parameter ist optional. Und es stellte sich heraus, dass das Team die resultierende Datei erstellt hatte, sah, dass sie sich im Verzeichnis befand, sie las und ihren Inhalt erneut bis zum Ende schrieb und dies tat, bis ich Strg + C drückte. Ich konnte das kontinuierliche Wachstum der Ausgabedatei für nichts anderes erklären


Ich wiederholte dies unter "sterilen" Bedingungen. Der Einfachheit und Reinheit halber habe ich das Experiment in einem separaten Verzeichnis durchgeführt, weil ich Angst habe, eine funktionierende Maschine zu töten


  1. Ich erstelle eine Textdatei


     echo "Hello world" > hello.txt 

  2. Ich führe den Befehl aus


     Get-ChildItem | Get-Content | Out-File result.txt 

    oder in Kurzform


     dir | cat | Out-File result.txt 

    Das Problem wird wiederholt. Die resultierende Datei wächst, ergänzt mit einer Zeile aus der Quelle (oder Zeilen aus sich selbst?). In 10 Sekunden Ausführung:


    • Eine Zeile der Quelldatei wird zu 400.000 Zeilen
    • Die Dateigröße wurde von 11 Byte auf fast 8 Megabyte erhöht
    • Der Prozessor ist zu ca. 20-25% ausgelastet.
    • Es gibt keine Überlastungen des Festplattensubsystems oder des Arbeitsspeichers. Anscheinend ist PowerShell hinsichtlich der Arbeit mit diesen Komponenten gut optimiert. )


Interessant ist auch: Wenn Sie den Namen der einzigen Datei im Verzeichnis als Parameter des letzten Befehls angeben, haben Sie natürlich die Trommelrolle erraten ... die Leere wird in die Datei geschrieben!


Hier ist eine so „interessante“ Arbeitslogik


Was ist passiert?


Die im ersten Schritt erstellte Datei beginnt zu wachsen. Dieses Verhalten ist zumindest unvorhersehbar.
Es war auch überraschend, dass das Betriebssystem weiterhin normal funktioniert. Die Datei wächst langsam (oder nicht wirklich?), Ohne die Arbeit des Benutzers zu blockieren.


Was ist gefährlich?


Nicht wahrnehmbare Füllung des Speicherplatzes.


Wie vermeide ich?


Filtern Sie die Liste der Eingabedateien:


 Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

Dies wird jedoch nicht gespeichert, wenn sowohl die Eingabe- als auch die Ausgabedatei der Filterbedingung entsprechen


PS


Ich verwende PowerShell Version 5.1.17134.407. Übrigens habe ich beim Versuch, es herauszufinden, alle Methoden / Logik und den gesunden Menschenverstand ausprobiert, die ich kenne (nämlich Flags wie -Version --version -v -h ). Aber das hat nicht geholfen. Hat wie immer Stackoverflow geholfen. Hier erfahren Sie, wie Sie die Version von PowerShell herausfinden


 $PSVersionTable.PSVersion 

Diese Antwort hat fast 3.000 Likes gesammelt! Dies ist sicherlich weniger als die Antwort auf die Frage, wie man vim schließt, aber ich denke, es ist auch bezeichnend!


Im Allgemeinen ist PowerShell wirklich eine leistungsstarke Sache (zumindest im Vergleich zu cmd.exe)! Und natürlich werde ich es weiterhin benutzen.

Source: https://habr.com/ru/post/de433682/


All Articles