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
Creo un archivo de texto
echo "Hello world" > hello.txt
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.