Pipe o conteúdo do arquivo para o comando do PowerShell sem carregar o arquivo inteiro na memória

6

Recentemente, comecei a usar o PowerShell, esperando nunca mais perder Bash novamente.

Eu quero restaurar uma instância de um banco de dados PostgreSQL . No Bash, ou no prompt de comando antigo, eu digitaria:

psql --username=... db_name < backup.sql

No PowerShell, descobri que precisava disso:

Get-Content backup.sql | & psql --username=... db_name

O problema é que backup.sql é grande - maior que a quantidade de RAM na minha máquina. O Get-Content primeiro lê o arquivo na memória e só então o envia para psql .

Isso é um problema.

Como posso simular o comportamento de < no PowerShell?

    
por zmbq 18.10.2015 / 11:58

3 respostas

3

Parece que o PowerShell Get-Content não é muito eficiente quando se trata de arquivos grandes, portanto, é possível usar a opção -ReadCount para informar quantas linhas por vez enviarão do arquivo. Eu coloquei 500 abaixo para que ele canalizasse 500 linhas de cada vez.

Leia também o artigo do Microsoft PowerShell abaixo.

Exemplo do PowerShell v 5.0

  • Get-Content -ReadCount 500 backup.sql | & psql --username=... db_name

Exemplo de versão herdada do PowerShell

  • Get-Content -Read 500 backup.sql | & psql --username=... db_name

Como o PowerShell Get-Content não é eficiente com arquivos grandes, dê uma olhada em Start-Process

Leia também o artigo do Microsoft PowerShell abaixo.

PowerShell v 5.0 Exemplo (usando -RedirectStandardInput switch)

Start-Process "C:\Program Files\PostgreSQL\<version>\bin\psql.exe" '--username=... db_name' -RedirectStandardInput backup.sql -NoNewWindow -Wait
    
por 18.10.2015 / 12:45
1

How can I simulate the behavior of < in PowerShell?

Verifique minha resposta a essa pergunta: O pipe do PowerShell adiciona alimentação de linha

Here is my Invoke-RawPipeline function (get latest version from this Gist).

Use it to pipe binary data between processes' Standard Output and Standard Input streams. It can read input stream from file/pipeline and save resulting output stream to file.

It requires PsAsync module to be able to launch and pipe data in multiple processes.

    
por 21.10.2015 / 21:04
0

Para resolver esse problema, criei um processo cmd.exe do powershell com os parâmetros executáveis

$cmdArgs = @('/c','psql.exe','--username=...', .. , 'dbname' , '<', 'backup.sql' )
&'cmd.exe' $cmdArgs

Trabalhou perfeito para o que eu estava tentando fazer

    
por 13.02.2017 / 22:40