PowerShell のバックグラウンドジョブ

少し改訂して自ブログから転載
 
unix系のシェルだとコマンド後に置く & (ampersand) で簡単に作れるバックグラウンドジョブですが、
残念ながら PowerShell v1 ではそれに相当する機能はありません
PowerShell では & は call operator であり
 

& "my command"

 
のようにコマンド、スクリプト、スクリプトブロックの呼び出しを行うための記述となります。
残念ながら呼び出されたスクリプトをバックグラウンドで実行させられるわけではありません。
PowerShell version 2 からは一応実現可能になるようです。
CTP3 版では PSSession を用いて、こんな感じで書けます。
 
$session01 = New-PSSession -ComputerName $ComputerName `
$job = Invoke-Command `
-AsJob -ScriptBlock $blockTest01 `
-Session $session01
 
なんだか面倒です。
ローカルで実行したいだけでも PowerShell remoting の設定が出来ていないとだめですし。
逆に言えば、リモートマシンにスクリプトブロックを送り込んで実行できるというのは、
なかなか便利な機能だと思います。
リモート実行の機能はこういう感じでいいとしても、
ローカルだけでももっとシンプルにバックグラウンドジョブを使えるようになって欲しいと期待します。
winrm がらみの設定がわかりやすくなって欲しいという希望もあります。
また、この方法には CTP2 から CTP3 になってもまだそのままの制限(仕様?)があります。
バックグラウンドジョブを実行しているセッションの中からはたとえば
 
Get-WmiObject -Class Win32_BIOS -ComputerName $OtherComputer
 
のように他のコンピュータにアクセスができないのです。
Enter-PSSession で入ったセッション内でさらに Enter-PSSession を行う二段重ねが出来ないのも、
内部的には同じ理由なのかもしれません。

コメント

  1. HIRO より:

    確かにPowerShell V1ではバックグラウンドジョブを実行させることができないですよね。
    これは、自分も不満でした。

    そういった意味でV2には期待をしています。

    New-PSSessionのサンプルソースありがとうございます。

    >ローカルで実行したいだけでも PowerShell remoting の設定が出来ていないとだめですし。
    そうなんですか…
    これはちょっと面倒ですね。
    V2がリリースされる前に見直してほしいところですね。

    またV2のコマンドレットで使用方法がわかったものがあれば投稿していただけると助かります。
    よろしくお願いいたします

  2. hiriumi より:

    バックグランドジョブってあるといいですね。例えばジョブを5つぐらい同時に実行しておいて、Get-Jobなんかのコマンドで実行中のジョブをリストしてくれるような。そしてそれを止めたり、一時停止したりできる・・・つまりWindowsサービスみたいなのをPowerShellでできたら楽しいかも。

タイトルとURLをコピーしました