6

Я недавно начал использовать PowerShell, надеясь никогда больше не пропустить Bash .

Я хочу восстановить экземпляр базы данных PostgreSQL . В Bash или в старой командной строке я бы набрал:

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

В PowerShell я обнаружил, что мне нужно это:

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

Проблема в том, что backup.sql большой - больше, чем объем оперативной памяти на моей машине. Get-Content сначала читает файл в память, а затем отправляет его в psql .

Это проблема.

Как я могу имитировать поведение < в PowerShell?

3 ответа3

4

Кажется, что PowerShell Get-Content не очень эффективен, когда дело касается огромных файлов, поэтому вы можете использовать ключ -ReadCount чтобы указать, сколько строк одновременно следует передать из файла. Я поставил 500 ниже, чтобы было 500 каналов одновременно.

Читайте статью о Microsoft PowerShell ниже.

Пример PowerShell v 5.0

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

Пример устаревшей версии PowerShell

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

Поскольку PowerShell Get-Content неэффективен для больших файлов, взгляните на Start-Process

Читайте статью о Microsoft PowerShell ниже.

Пример PowerShell v 5.0 (с использованием -RedirectStandardInput )

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

Как я могу имитировать поведение <в PowerShell?

Проверьте мой ответ на этот вопрос: канал PowerShell добавляет перевод строки

Вот моя функция Invoke-RawPipeline (получить последнюю версию из этого списка).

Используйте его для передачи двоичных данных между потоками Standard Output и Standard Input. Он может читать входной поток из файла / конвейера и сохранять полученный выходной поток в файл.

Для этого требуется, чтобы модуль PsAsync мог запускать и передавать данные в несколько процессов.

0

Чтобы решить эту проблему, я создал процесс powershell cmd.exe с исполняемыми параметрами

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

Работал идеально для того, что я пытался сделать

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .