Como combinar o conteúdo do arquivo no PowerShell. E não sofra

O que tinha que ser feito


Uma vez eu precisei combinar um monte de arquivos de texto em um diretório em um arquivo. Eu não queria fazer isso com as mãos e o Google veio em meu auxílio, como sempre! Ouvi muito sobre o poder de uma ferramenta como o PowerShell e decidi usá-la para essa "mega tarefa". Pelo menos porque não estou familiarizado com a miséria do cmd.exe . Bem, fazê-lo com as mãos não é o nosso caminho.


O que deu errado


O Google me disse que você pode fazer isso com um comando simples


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

"Muito legal! Apenas uma maneira do Unix!" Eu pensei. Copiei o comando, modifiquei-o levemente e pressionei Enter. O cursor mudou-se para uma nova linha ... e nada mais. No gerenciador de arquivos, abri o arquivo final - era realmente algo semelhante ao resultado desejado. Tinha muitas linhas dos arquivos de origem. Voltando ao console, vi que o processo ainda está ... no processo. Ajudou Ctrl + C.


Olhando mais de perto o tamanho do arquivo, vi que ele era de alguma forma suspeito de tamanho grande. Seu tamanho excedeu 100 megabytes. Embora os dados da água não fossem tão grandes.


Por que isso aconteceu?


É tudo sobre a minha "modificação fácil". Eu só não precisava de um filtro de extensão. Sim, e este parâmetro é opcional. E aconteceu que a equipe criou o arquivo resultante, viu que ele estava no diretório, leu e escreveu seu conteúdo até o fim novamente e fez até pressionar Ctrl + C e não consegui explicar o crescimento contínuo do arquivo de saída para mais nada


Repeti isso em condições "estéreis". Por simplicidade e pureza, fiz o experimento em um diretório separado, porque tenho medo de matar uma máquina em funcionamento


  1. Eu crio um arquivo de texto


     echo "Hello world" > hello.txt 

  2. Eu executo o comando


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

    ou em forma abreviada


     dir | cat | Out-File result.txt 

    O problema está repetido. O arquivo resultante cresce, reabastecido com uma linha da fonte (ou linhas de si mesma?). Em 10 segundos de execução:


    • uma linha do arquivo de origem se transforma em 400 mil linhas
    • tamanho do arquivo aumentado de 11 bytes para quase 8 megabytes
    • o processador é carregado em cerca de 20-25%.
    • não há sobrecargas do subsistema de disco ou RAM. Aparentemente, o PowerShell está bem otimizado em termos de trabalho com esses componentes. )


Também é interessante - se você especificar o nome do único arquivo no diretório como o parâmetro do último comando, é claro que adivinhou o rolo da bateria ... o vazio será gravado no arquivo!


Aqui está uma lógica de trabalho "interessante"


O que aconteceu


O arquivo criado na primeira etapa começa a crescer. Esse comportamento é pelo menos imprevisível.
Também foi surpreendente que o sistema operacional continue funcionando normalmente. O arquivo cresce lentamente (ou não realmente?) Sem bloquear o trabalho do usuário.


O que é perigoso


Preenchimento imperceptível de espaço em disco.


Como evitar


Filtre a lista de arquivos de entrada:


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

Mas isso não será salvo se os arquivos de entrada e saída corresponderem à condição do filtro


PS


Estou usando o PowerShell versão 5.1.17134.407. A propósito, ao tentar descobrir, tentei todos os métodos / lógica e senso comum que conheço (ou seja, sinalizadores como -Version --version -v -h ). Mas isso não ajudou. Ajudou , como sempre, o Stackoverflow. Veja como descobrir a versão do PowerShell


 $PSVersionTable.PSVersion 

Esta resposta coletou quase 3.000 curtidas! Isso certamente é menor do que a resposta à pergunta de como fechar o vim , mas também, penso eu, é indicativa!


Em geral, o PowerShell é realmente algo poderoso (pelo menos em comparação com o cmd.exe)! E é claro que continuarei a usá-lo.

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


All Articles