Primeiro, estou aprendendo Powershell há cerca de uma semana, principalmente adaptando scripts Linux para rodar em minha máquina Windows (mais poderosa). Então, por favor, seja gentil com a linguagem.
Estou tentando escrever um script que analisa um fluxo de dados de string gravados em stdout por outro comando enquanto está sendo gravado. A quantidade de dados que estão sendo gravados é grande e demorada e seria bom processá-los conforme são gravados, em vez de gravá-los em um arquivo de texto e, posteriormente, processá-los.
A saída são strings ASCII com um delimitador de nova linha (ou sendo Windows, talvez um retorno de carro também). Aqui está efetivamente o que eu quero fazer:
foreach ($i in (ffprobe -i "$sourceFile" -show_frames))
{
if ("$i".Substring(0,1) -eq "[" -and "$i".Substring(1,1) -ne "/")
{
echo "$i".Substring(0,1)
echo "$i".Substring(1,1)
echo "$i"
<do other stuff>
}
}
O ffprobe -i "$sourceFile" -show_frames
comando gera texto como:
[FRAME]
DATA1
DATA1
[/FRAME]
Basicamente, quero tratar os dados que estão sendo gravados no stdout como um 'loop while' até que não haja mais conteúdo sendo gravado. Só preciso analisar uma linha de dados por vez. Dito e feito, eu esperaria que o número de linhas sendo produzidas variasse entre 5 e 10 milhões de linhas.
FYI, minha máquina deve ser capaz de lidar com a quantidade de dados. Tenho dual Xeon E5 v3 com 12 núcleos (24 com hyperthreading) e 128 GB de RAM. Conforme eu processo os dados, aproximadamente a cada 10-15 linhas de saída serão processadas e gravadas em um arquivo de texto - embora eu possa criar uma variável de buffer para gravar a saída processada e liberá-la em um arquivo a cada poucos milhares de linhas de saída.
Agradecemos antecipadamente por alguma orientação.
O seguinte resolveu meu problema. Não sei se é o mais eficiente, mas funciona para mim. Se você tiver uma maneira mais eficiente, eu a aceito.
*********** ATUALIZAÇÃO 2020-04-12 ***********
Acontece que não precisei usar o WSL - foi apenas a primeira solução que descobri. A solução acima funcionará como escrita sem ou sem usar
wsl
(além disso, você evita possíveis problemas de nomenclatura associados à passagem de arquivos do Windows para o WSL). Portanto, não há necessidade de WSL neste caso. Inicialmente, quando eu estava testando abordagens no Powershell, acho que falhou devido a um erro de sintaxe. Especificamente, a seguinte configuração falhou:Observe que a chave aberta
{
para oForEach-Object
não está na mesma linha doForEach-Object
comando, mas sim na próxima linha. Por motivos que desconheço, o script Powershell falharia. No entanto, quando configurado como a solução acima, semwsl
que aForEach-Object
braçadeira de abertura{
esteja na mesma linha, a entrada canalizada no loop funciona sem problemas. Então, só para ser minucioso, aqui está como a solução semwsl
parece: