web-dev-qa-db-ja.com

ファイル全体をメモリに読み込まずにファイルのコンテンツをPowerShellコマンドにパイプする

私は最近、PowerShellを使い始めて、再び Bash を見逃さないことを期待しています。

PostgreSQL データベースのインスタンスを復元したい。 Bashまたは古いコマンドプロンプトでは、次のように入力します。

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

PowerShellでは、これが必要であることがわかりました。

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

問題は、backup.sqlが大きいことです。私のマシンではRAM)の量よりも大きくなります Get-Content 最初にファイルをメモリに読み取り、それを送信しますpsqlに。

これは問題です。

PowerShellで<の動作をシミュレートするにはどうすればよいですか?

10
zmbq

巨大なファイルに関しては、PowerShell Get-Contentはあまり効率的ではないようです。そのため、-ReadCountスイッチを使用して、ファイルから一度にパイプする行数を指示できる場合があります。下に500を置いたので、一度に500ラインを配管します。

以下のMicrosoft PowerShellの記事もお読みください。

PowerShell v 5.0の例

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

PowerShell Legacy Version Example

  • 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
8
Pimp Juice IT

この問題を解決するために、実行可能パラメーターを使用してpowershell cmd.exeプロセスを作成しました

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

私がやろうとしていたことに対して完璧に働いた

2
Kram

PowerShellで<の動作をシミュレートするにはどうすればよいですか?

この質問に対する私の答えを確認してください: PowerShellのパイプが改行を追加します

これが私のInvoke-RawPipeline関数(最新バージョンを this Gist)から取得

これを使用して、プロセスの標準出力ストリームと標準入力ストリーム間でバイナリデータをパイプ処理します。 ファイル/パイプラインから入力ストリームを読み取り、結果の出力ストリームをファイルに保存できます。

複数のプロセスでデータを起動してパイプできるようにするには、 PsAsyncモジュール が必要です。

1
beatcracker