Comment combiner le contenu d'un fichier dans PowerShell. Et ne souffre pas

Que fallait-il faire


Une fois, je devais combiner un tas de fichiers texte se trouvant dans un répertoire en un seul fichier. Je ne voulais pas le faire de mes mains et Google est venu à mon aide, comme toujours! J'ai beaucoup entendu parler de la puissance d'un outil comme PowerShell et j'ai décidé de l'utiliser pour cette "méga tâche". Du moins parce que je ne connais pas la misère de cmd.exe . Eh bien, le faire avec vos mains n'est pas notre chemin.


Qu'est-ce qui a mal tourné


Google m'a dit que vous pouvez le faire avec une simple commande


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

"Vraiment cool! Juste une sorte de méthode Unix!" Pensai-je. J'ai copié la commande, l'ai légèrement modifiée et j'ai appuyé sur Entrée. Le curseur s'est déplacé vers une nouvelle ligne ... et rien de plus. Dans le gestionnaire de fichiers, j'ai ouvert le fichier final - c'était vraiment quelque chose de similaire au résultat souhaité. Il y avait beaucoup de lignes des fichiers source. En revenant à la console, j'ai vu que le processus est toujours ... en cours. Aide Ctrl + C.


En examinant de plus près la taille du fichier, j'ai vu qu'elle était en quelque sorte étrangement volumineuse. Sa taille dépassait 100 mégaoctets. Bien que les données sur l'eau n'étaient pas si grandes.


Pourquoi est-ce arrivé?


Il s'agit de ma "modification facile". Je n'avais tout simplement pas besoin d'un filtre d'extension. Oui, et ce paramètre est facultatif. Et il s'est avéré que l'équipe a créé le fichier résultant, a vu qu'il était dans le répertoire, l'a lu et a écrit son contenu jusqu'à la fin et l'a fait jusqu'à ce que j'appuie sur Ctrl + C Je ne pouvais pas expliquer la croissance continue du fichier de sortie pour autre chose


J'ai répété cela dans des conditions "stériles". Pour plus de simplicité et de pureté, j'ai fait l'expérience dans un répertoire séparé, car j'ai peur de tuer une machine qui fonctionne


  1. Je crée un fichier texte


     echo "Hello world" > hello.txt 

  2. J'exécute la commande


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

    ou sous forme abrégée


     dir | cat | Out-File result.txt 

    Le problème se répète. Le fichier résultant se développe, reconstitué avec une ligne de la source (ou des lignes de lui-même?). En 10 secondes d'exécution:


    • une ligne du fichier source se transforme en 400 mille lignes
    • la taille du fichier est passée de 11 octets à près de 8 mégaoctets
    • le processeur est chargé d'environ 20-25%.
    • il n'y a pas de surcharge du sous-système de disque ou de la RAM. Apparemment, PowerShell est bien optimisé en termes de travail avec ces composants. )


C'est aussi intéressant - si vous spécifiez le nom du seul fichier du répertoire comme paramètre de la dernière commande, alors, bien sûr, vous avez deviné le roulement de tambour ... le vide sera écrit dans le fichier!


Voici une telle logique de travail «intéressante»


Qu'est-il arrivé?


Le fichier créé à la première étape commence à croître. Ce comportement est au moins imprévisible.
Il était également surprenant que le système d'exploitation continue de fonctionner normalement. Le fichier se développe lentement (ou pas vraiment?) Sans bloquer le travail de l'utilisateur.


Qu'est-ce qui est dangereux


Remplissage imperceptible de l'espace disque.


Comment éviter


Filtrer la liste des fichiers d'entrée:


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

Mais cela ne sera pas enregistré si les fichiers d'entrée et de sortie correspondent à la condition du filtre


PS


J'utilise la version 5.1.17134.407 de PowerShell. Soit dit en passant, en essayant de le découvrir, j'ai essayé toutes les méthodes / logique et le bon sens que je connais (à savoir les indicateurs comme -Version --version -v -h ). Mais cela n'a pas aidé. Aidé , comme toujours, Stackoverflow. Voici comment découvrir la version de PowerShell


 $PSVersionTable.PSVersion 

Cette réponse a collecté près de 3 000 likes! C'est certainement moins que la réponse à la question de savoir comment fermer vim , mais aussi, je pense, est indicatif!


En général, PowerShell est vraiment une chose puissante (au moins en comparaison avec cmd.exe)! Et bien sûr, je continuerai à l'utiliser.

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


All Articles