この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 10956|答える: 3

PowerShellは.netを呼び出し、イベントにサブスクライブします[ソースコード]

[リンクをコピー]
掲載地 2017/01/17 17:05:59 | | | |


私は.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のソースコードを添付します:

観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ答える





先の:PowerShellの単一行コメント、多行コメント、ブロックコメントのメソッド
次に:PowerShellはWebClientを利用してファイルをダウンロードします
掲載地 2017/04/26 14:35:44 |
132432423432423
掲載地 2019/04/16 17:14:12 |
2222222222222
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com