私は.net WebClientオブジェクトを使ってファイルダウンロードを実装しています。
そしてPowerShellを使ってDownloadProgressChangedイベントにサブスクライブしてください。
ダウンロードの進行バーを更新しました。
サブスクリプションイベントはPowerShellのRegister-ObjectEventを使用しており、導入文書は以下の通りです。
概要 Microsoft .NET Frameworkオブジェクトによって生成されるイベントにサブスクライブします。
文法 Register-ObjectEvent [-InputObject] <PSObject> [-EventName] <String> [[-SourceIdentifier] <String>] [-Action] <ScriptBlock>] [-Forward ] [-MaxTriggerCount<Int32>] [-MessageData <PSObject>][-サポートイベント][<CommonParameters>]
インプット 全くありません オブジェクトをRegister-ObjectEvent にパイプすることはできません。
出力 システム.管理.自動化.PSEventJob このコマンドレットは出力を生成しません。
釈義 * イベント、イベントサブスクリプション、イベントキューは現在のセッションにのみ存在します。 現在のセッションを閉じると、イベントキューは破棄され、イベントサブスクリプションもキャンセルされます。
例 例1:新しいプロセスが始まったときにイベントを購読する PS C:\>$Query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance isa 'Win32_Process'" PS C:\>$ProcessWatcher = New-Object System.Management.ManagementEventWatcher $Query PS C:\>Register-ObjectEvent -InputObject $ProcessWatcher -EventName "EventArrived"
この例は新しいプロセスが開始された際に生成されるイベントをサブスカブします。
このコマンドはManagementEventWatcherオブジェクトを使ってEventArrivedイベントを取得します。 クエリオブジェクトは、イベントがWin32_Processクラスのインスタンス作成イベントであることを指定します。 例2:イベントに応答するアクションを指定する PS C:\>$Query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance isa 'Win32_Process'" PS C:\>$ProcessWatcher = New-Object System.Management.ManagementEventWatcher $query PS C:\>$Action = { New-Event "PowerShell.ProcessCreated" -Sender $Sender -EventArguments $EventArgs.NewEvent.TargetInstance } PS C:\>register-objectEvent -InputObject $ProcessWatcher -EventName "EventArrived" -Action $Action Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 422cfe5a-65e... 真の新イベント「PowerShe...」を開催
この例は、イベントに応答するアクションを指定する方法を示しています。 アクションを指定すると、発生したイベントはイベントキューに追加されません。 代わりに、アクションはその出来事に反応します。
この例では、新しいプロセス開始を示すインスタンス作成イベントが発生した際に、新たなProcessCreatedイベントが発生します。
このアクションは$Senderと$EventArgs自動変数を使用し、これらはイベントアクション専用に入力されます。
Register-ObjectEvent コマンドは、そのアクションを表すジョブオブジェクトを返し、バックグラウンドジョブとして実行されます。 Get-JobやReceive-Jobなどのジョブコマンドレットを使ってバックグラウンドジョブを管理できます。
詳細については、about_Jobsをご覧ください。 例3:リモートコンピュータでオブジェクトイベントをサブスクライブする PS C:\>$S = New-PSSession -ComputerName "Server01, Server02" PS C:\> Invoke-Command -Session $S -FilePath ProcessCreationEvent.ps1 PS C:\> Invoke-Command -Session $S { get-event }# ProcessCreationEvent.ps1function Enable-ProcessCreationEvent{ $Query = New-Object System.Management.WqlEventQuery "__ InstanceCreationEvent", ' (新しい対象 TimeSpan 0,0,1), ' "TargetInstance isa 'Win32_Process'" $ProcessWatcher = New-Object System.Management.ManagementEventWatcher $Query $Identifier = "WMI. ProcessCreated" Register-ObjectEvent -Input $ProcessWatcher -EventName "EventArrived" ' -SourceIdentifier $Identifier -MessageData "Test" -forward}EnableProcessCreationEvent
この例は、リモートコンピュータ上でオブジェクトイベントを購読する方法を示しています。
最初のコマンドは2台のリモートコンピュータでPSSessionsを作成し、$S変数に保存します。
2つ目のコマンドは、Invoke-CommandコマンドレットのFilePathパラメータを使い、$Sの各PSSessionsでProcessCreationEvent.ps1スクリプトを実行します。
このスクリプトにはRegister-ObjectEventコマンドが含まれており、ManagementEventWatcherオブジェクトとそのEventArrivedを通じてWin32_Processオブジェクトのインスタンス作成イベントにサブスクライブします イベント。 例4:PSEventJobオブジェクトの動的モジュールを使用する PS C:\>$Timer = 新しいオブジェクトタイマー。タイマー PS C:>$Timer.Interval = 500 PS C:\>$Job = Register-ObjectEvent -InputObject $Timer -EventName Elapsed -SourceIdentifier Timer.Random -Action {$Random = Get-Random -Min 0 -Max 100} PS C:\>$Job.gettype().fullnameSystem.Management.Automation.PSEventJob 追伸 C:\>$Job | Format-List - プロパティ * 州: RunningModule : __DynamicModule_6b5cbe82-d634-41d1-ae5e-ad7fe8d57fe0 ステータスメッセージ: HasMoreData:その通りです 所在地: コマンド:$Random= 取得-ランダム -最小 0 -最大100 JobStateInfo : ランニング 完了:System.Threading.ManualResetEvent インスタンスID:88944290-133d-4b44-8752-f901bd8012e2 ID : 1 名前:タイマー・ランダム ChildJobs : {}... PS C:\>$Timer.Enabled = $True PS C:\>& $Job.module {$Random}60 PS C:\>& $Job.module {$Random}47
この例は、イベント登録にActionを含める際に作成されるPSEventJobオブジェクトの動的モジュールの使い方を示しています。
最初のコマンドはNew-Object cmdletを使ってタイマーオブジェクトを作成します。 2つ目のコマンドはタイマーの間隔を500(ミリ秒)に設定します。
3つ目のコマンドは、タイマーオブジェクトの経過イベントを登録するためにRegister-ObjectEvent コマンドレットを使用します。 コマンドにはイベントを処理するアクションが含まれています。 タイマー間隔が経過するとイベントが発生し、アクション内のコマンドが実行されます。 この場合、Get-Randomコマンドレットは0から100の間の乱数を生成し、それを$Randomvariableに保存します。
Register-ObjectEventコマンドでActionパラメータを使用すると、そのコマンドはアクションを表すPSEventJobオブジェクトを返します。 コマンドはジョブオブジェクトを $Job 変数に保存します。
Register-ObjectEventコマンドレットが返すPSEventJobオブジェクトは、イベントサブスクライバーのActionプロパティにも存在します。 詳細はGet-EventSubscriberをご覧ください。
4番目のコマンドは、$Job変数にPSEventJobオブジェクトが含まれていることを示します。 5番目のコマンドはFormat-List コマンドレットを使い、PSEventJobオブジェクトのすべてのプロパティをリストに表示します。
PSEventJobには、アクションを実装する動的スクリプトモジュールを含むモジュールプロパティがあります。
6番目のコマンドでタイマーが有効になります。
残りのコマンドは、呼び出し演算子(&)を使ってモジュール内でコマンドを呼び出し、$Random変数の値を表示します。 呼び出しオペレーターを使ってモジュール内の任意のコマンドを呼び出しることができ、エクスポートされていないコマンドも含まれます。 この場合、コマンドは経過イベントが発生した際に生成される乱数を表示します。
モジュールの詳細については、about_Modulesを参照してください。
関連リンク オンライン版:http://go.microsoft.com/fwlink/?LinkId=821845 Get-Event 新イベント Register-EngineEvent Register-WmiEvent 除去イベント 登録イベント解除 待機イベント 最後に、PSのソースコードを添付します:
観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ 答える
|