Cómo combinar el contenido del archivo en PowerShell. Y no sufras

Lo que tenia que hacer


Una vez que necesitaba combinar un montón de archivos de texto en un directorio en un solo archivo. ¡No quería hacer esto con mis manos y Google vino en mi ayuda, como siempre! Escuché mucho sobre el poder de una herramienta como PowerShell, y decidí usarla para esta "mega tarea". Al menos porque no estoy familiarizado con la miseria de cmd.exe . Bueno, hacerlo con las manos no es nuestro camino.


Que salió mal


Google me dijo que puedes hacer esto con un simple comando


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

"¡Realmente genial! ¡Solo una especie de estilo Unix!" Pensé Copié el comando, lo modifiqué un poco y presioné Enter. El cursor se movió a una nueva línea ... y nada más. En el administrador de archivos, abrí el archivo final; realmente era algo similar al resultado deseado. Tenía muchas líneas de los archivos de origen. Volviendo a la consola, vi que el proceso todavía está ... en el proceso. Ayudado Ctrl + C.


Al observar más de cerca el tamaño del archivo, vi que de alguna manera era sospechosamente grande. Su tamaño superó los 100 megabytes. Aunque los datos del agua no eran tan grandes.


¿Por qué sucedió esto?


Se trata de mi "modificación fácil". Simplemente no necesitaba un filtro de extensión. Sí, y este parámetro es opcional. Y resultó que el equipo creó el archivo resultante, vio que estaba en el directorio, lo leyó y escribió su contenido hasta el final nuevamente y lo hizo hasta que presioné Ctrl + C. No pude explicar el crecimiento continuo del archivo de salida para nada más.


Repetí esto bajo condiciones "estériles". Por simplicidad y pureza, hice el experimento en un directorio separado, porque me da miedo matar una máquina que funciona


  1. Creo un archivo de texto


     echo "Hello world" > hello.txt 

  2. Ejecuto el comando


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

    o en forma corta


     dir | cat | Out-File result.txt 

    El problema se repite. El archivo resultante crece, rellenado con una línea de la fuente (¿o líneas de sí mismo?). En 10 segundos de ejecución:


    • una línea del archivo fuente se convierte en 400 mil líneas
    • el tamaño del archivo aumentó de 11 bytes a casi 8 megabytes
    • El procesador se carga en aproximadamente un 20-25%.
    • no hay sobrecargas del subsistema de disco o RAM. Aparentemente, PowerShell está bien optimizado en términos de trabajo con estos componentes. )


También es interesante: si especifica el nombre del único archivo en el directorio como parámetro del último comando, entonces, por supuesto, adivinó el redoble de tambor ... ¡el vacío se escribirá en el archivo!


Aquí hay una lógica de trabajo tan "interesante"


Que paso


El archivo creado en el primer paso comienza a crecer. Este comportamiento es al menos impredecible.
También fue sorprendente que el sistema operativo continúe funcionando normalmente. El archivo crece lentamente (¿o no realmente?) Sin bloquear el trabajo del usuario.


Que es peligroso


Relleno imperceptible de espacio en disco.


Cómo evitar


Filtre la lista de archivos de entrada:


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

Pero esto no se guardará si los archivos de entrada y salida coinciden con la condición del filtro


PS


Estoy usando PowerShell versión 5.1.17134.407. Por cierto, al tratar de averiguarlo, probé todos los métodos / lógica y sentido común que conozco (es decir, banderas como -Version --version -v -h ). Pero eso no ayudó. Ayudado , como siempre, Stackoverflow. Aquí le mostramos cómo encontrar la versión de PowerShell


 $PSVersionTable.PSVersion 

¡Esta respuesta ha recopilado casi 3,000 me gusta! Esto es ciertamente menos que la respuesta a la pregunta de cómo cerrar vim , pero también, creo, ¡es indicativo!


¡En general, PowerShell es realmente una cosa poderosa (al menos en comparación con cmd.exe)! Y, por supuesto, continuaré usándolo.

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


All Articles