私は最近、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で<
の動作をシミュレートするにはどうすればよいですか?
巨大なファイルに関しては、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
この問題を解決するために、実行可能パラメーターを使用してpowershell cmd.exeプロセスを作成しました
$cmdArgs = @('/c','psql.exe','--username=...', .. , 'dbname' , '<', 'backup.sql' )
&'cmd.exe' $cmdArgs
私がやろうとしていたことに対して完璧に働いた
PowerShellで<の動作をシミュレートするにはどうすればよいですか?
この質問に対する私の答えを確認してください: PowerShellのパイプが改行を追加します
これが私の
Invoke-RawPipeline
関数(最新バージョンを this Gist)から取得 。これを使用して、プロセスの標準出力ストリームと標準入力ストリーム間でバイナリデータをパイプ処理します。 ファイル/パイプラインから入力ストリームを読み取り、結果の出力ストリームをファイルに保存できます。
複数のプロセスでデータを起動してパイプできるようにするには、 PsAsyncモジュール が必要です。