199

bash では、アンパサンド (&) を使用してコマンドをバックグラウンドで実行し、コマンドの実行が完了する前にインタラクティブな制御をユーザーに返すことができます。Powershellでこれを行う同等の方法はありますか?

bash での使用例:

 sleep 30 &
4

8 に答える 8

157

コマンドが実行可能ファイルまたは実行可能ファイルに関連付けられているファイルである限り、Start-Process (v2 から利用可能) を使用します。

Start-Process -NoNewWindow ping google.com

これを関数としてプロファイルに追加することもできます。

function bg() {Start-Process -NoNewWindow @args}

そして、呼び出しは次のようになります。

bg ping google.com

私の意見では、バックグラウンドでプロセスを実行するという単純なユース ケースでは、Start-Job はやり過ぎです。

  1. Start-Job は既存のスコープにアクセスできません (別のセッションで実行されるため)。「Start-Job {notepad $myfile}」は実行できません
  2. Start-Job は現在のディレクトリを保持しません (別のセッションで実行されるため)。myfile.txt が現在のディレクトリにある場合、「Start-Job {notepad myfile.txt}」を実行できません。
  3. 出力は自動的には表示されません。ジョブの ID をパラメーターとして Receive-Job を実行する必要があります。

注: 最初の例に関しては、スリープは Powershell コマンドレットであるため、「bg sleep 30」は機能しません。Start-Process は、実際にプロセスをフォークした場合にのみ機能します。

于 2012-12-05T17:48:33.290 に答える
31

に渡されたスクリプト ブロックはStart-Job、コマンドと同じ現在のディレクトリで実行されていないStart-Jobようです。必要に応じて完全修飾パスを指定してください。

例えば:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
于 2012-07-07T06:19:39.210 に答える
23
ps2> start-job {start-sleep 20}

stdoutをリアルタイムで取得する方法をまだ理解していません。start-jobでは、get-jobを使用してstdoutをポーリングする必要があります。

更新:基本的にbash&operatorである、やりたいことを簡単に実行するためのジョブを開始できませんでした。これが私のこれまでの最高のハックです

PS> notepad $profile #edit init script -- added these lines
function beep { write-host `a }
function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done
function acjp { start powershell {ant clean java-platform|out-null;beep} }
PS> . $profile #re-load profile script
PS> ajp
于 2011-06-23T19:42:38.747 に答える
22

PowerShell ジョブ コマンドレットを使用して、目標を達成できます。

PowerShell で使用できるジョブ関連のコマンドレットは 6 つあります。

  • ゲットジョブ
    • 現在のセッションで実行されている Windows PowerShell バックグラウンド ジョブを取得します
  • 受信ジョブ
    • 現在のセッションでの Windows PowerShell バックグラウンド ジョブの結果を取得します
  • 削除ジョブ
    • Windows PowerShell バックグラウンド ジョブを削除します
  • ジョブ開始
    • Windows PowerShell バックグラウンド ジョブを開始します
  • ストップジョブ
    • Windows PowerShell バックグラウンド ジョブを停止します
  • 待機ジョブ
    • セッションで実行されている Windows PowerShell バックグラウンド ジョブの 1 つまたはすべてが完了するまで、コマンド プロンプトを抑制します。

興味深い場合は、サンプルのHow to create background job in PowerShell をダウンロードできます

于 2016-11-09T09:13:38.547 に答える
6

このようなことができます。

$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru

そして、それを待ちたい場合:

$a | wait-process

ボーナス OSX または Linux バージョン:

$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru 

私が持っているpingerスクリプトの例。引数は配列として渡されます。

$1 = start -n powershell pinger,comp001 -pa
于 2019-07-10T03:32:02.583 に答える
-1

ここで説明されているソリューションhttp://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entryを PowerShell v1.0 で正常に使用しました。PowerShell v2.0 では間違いなく簡単になります。

于 2008-10-09T10:55:04.697 に答える