Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 10956|Odpověď: 3

PowerShell volá .net a odebírá události [zdrojový kód]

[Kopírovat odkaz]
Zveřejněno 17.01.2017 17:05:59 | | | |


Používám objekt .net WebClient k implementaci stahování souborů,

A použijte powershell k odběru události DownloadProgressChanged,

Aktualizoval jsem ukazatel průběhu stahování.

Událost předplatného používá Register-ObjectEvent v powershellu a úvodní dokument je následující:

Abstrakt
    Přihlašuje se k událostem generovaným objektem Microsoft .NET Framework.

gramatika
    Registr-ObjektUdálost [-InputObject] <PSObject> [-EventName] <String> [[-SourceIdentifier] <String>] [[-Action] <ScriptBlock>] [-Forward] [-MaxTriggerCount <Int32>] [-MessageData<PSObject>. ] [-SupportEvent] [<CommonParameters>]


vstup
    Žádné
    Objekty nelze použít do Register-ObjectEvent .

Výstup
    System.Management.Automation.PSEventJob
    Tento cmdlet negeneruje žádný výstup.

exegeze
    * Události, odběry událostí a fronta událostí existují pouze v aktuální relaci. Pokud ukončíte aktuální relaci, fronta událostí se zruší a předplatné události je zrušeno.
   

příklad
    Příklad 1: Odebírejte události při zahájení nového procesu
    PS C:\>$Query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance je 'Win32_Process'"
    PS C:\>$ProcessWatcher = New-Object System.Management.ManagementEventWatcher $Query
    PS C:\>Register-ObjectEvent -InputObject $ProcessWatcher -EventName "EventArrived"
   
    Tento příklad se přijímá k událostem generovaným při spuštění nového procesu.

Příkaz používá objekt ManagementEventWatcher k získání událostí EventArrived. Dotazovací objekt specifikuje, že události jsou událostmi vytváření instance pro třídu Win32_Process.
    Příklad 2: Specifikujte akci, která má reagovat na událost
    PS C:\>$Query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance je '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... Vedení skutečné nové události "PowerShe...
   
    Tento příklad ukazuje, jak specifikovat akci, která má reagovat na událost. Když zadáte akci, události, které se vyvolají, se do fronty událostí nepřidají. Místo toho akce reaguje na událost.

V tomto příkladu, když je vyvolána událost vytvoření instance, která oznamuje spuštění nového procesu, vyvolá se nová událost ProcessCreated.

Akce využívá automatické proměnné $Sender a $EventArgs, které se vyplňují pouze pro akce událostí.

Příkaz Register-ObjectEvent vrací objekt úlohy, který akci reprezentuje a ta se spustí jako úloha na pozadí. Můžete použít Job cmdlety, jako jsou Get-Job a Receive-Job, k řízení pozadí práce.

Pro více informací viz about_Jobs.
    Příklad 3: Přihlásit se k odběru objektových událostí na vzdálených počítačích
    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", '
       (Časové období nového objektu 0,0,1), '
       "TargetInstance je 'Win32_Process'" $ProcessWatcher = New-Object System.Management.ManagementManagementEventWatcher $Query $Identifier = "WMI. ProcessCreated" Register-ObjectEvent -Input $ProcessWatcher -EventName "EventArrived" '
       -SourceIdentifier $Identifier -MessageData "Test" -Forward}EnableProcessCreationEvent
   
    Tento příklad ukazuje, jak se přihlásit k odběru objektových událostí na vzdálených počítačích.

První příkaz vytváří PSSessions na dvou vzdálených počítačích a ukládá je do proměnné $S.

Druhý příkaz využívá parametr FilePath v příkazu Invoke-Command k spuštění skriptu ProcessCreationEvent.ps1 v každé z PSSession v $S.

Skript obsahuje příkaz Register-ObjectEvent, který se přihlašuje k událostem vytváření instance na objektu Win32_Process prostřednictvím objektu ManagementEventWatcher a jeho EventArrived události.
    Příklad 4: Použijte dynamický modul v objektu PSEventJob
    PS C:\>$Timer = Časovače pro nové objekty. Časovač
    PS C:\>$Timer.interval = 500
    PS C:\>$Job = Register-ObjectEvent -InputObject $Timer -EventName Uplynulo -SourceIdentifier Timer.Random -Action {$Random = Get-Random -min 0 -max 100}
    PS C:\>$Job.gettype().fullnameSystem.Management.Automation.PSEventJob
    PS C:\>$Job | Formát-List -vlastnost *
    Stav :
    RunningModule : __DynamicModule_6b5cbe82-d634-41d1-ae5e-ad7fe8d57fe0
    StatusMessage :
    HasMoreData: Pravda
    Lokalita:
    Příkaz : $Random= Get-Random -Min 0 -Max 100
    JobStateInfo : Běh
    Dokončeno: System.Threading.ManualResetEvent
    InstanceId : 88944290-133d-4b44-8752-f901bd8012e2
    Id : 1
    Jméno: Timer.Random
    ChildJobs : {}... PS C:\>$Timer.Enabled = $True
    PS C:\>& $Job.module {$Random}60
    PS C:\>& $Job.module {$Random}47
   
    Tento příklad ukazuje, jak použít dynamický modul v objektu PSEventJob, který vzniká, když zahrnete akci do registrace události.

První příkaz používá příkaz New-Object k vytvoření časovače. Druhý příkaz nastaví interval časovače na 500 (milisekund).

Třetí příkaz využívá cmdlet Register-ObjectEvent k registraci události Elapsed objektu časovače. Příkaz obsahuje akci, která událost zvládne. Kdykoli časovač uplyne, událost se spustí a spustí se příkazy v akci. V tomto případě cmdlet Get-Random vygeneruje náhodné číslo mezi 0 a 100 a uloží ho do $Randomvariable.

Když použijete parametr akce v příkazu Register-ObjectEvent, příkaz vrátí objekt PSEventJob, který tuto akci reprezentuje. Příkaz uloží objekt práce do proměnné $Job.

Objekt PSEventJob, který vrací cmdlet Register-ObjectEvent, je také dostupný ve vlastnosti Action účastníka události. Pro více informací navštivte Get-EventSubscriber.

Čtvrtý příkaz ukazuje, že proměnná $Job obsahuje objekt PSEventJob. Pátý příkaz používá cmdlet Format-List k zobrazení všech vlastností objektu PSEventJob v seznamu.

PSEventJob má vlastnost Module, která obsahuje dynamický skriptový modul implementující akci.

Šestý příkaz aktivuje časovač.

Zbývající příkazy používají volací operátor (&) k vyvolání příkazu v modulu a zobrazení hodnoty proměnné $Random. Operátor volání můžete použít k vyvolání libovolného příkazu v modulu, včetně těch, které nejsou exportovány. V tomto případě příkazy ukazují náhodné číslo, které je generováno v okamžiku události Elapsed.

Pro více informací o modulech viz about_Modules.


Související odkazy
    Online verze: http://go.microsoft.com/fwlink/?LinkId=821845
    Get-Event
    Nová událost
    Register-EngineEvent
    Register-WmiEvent
    Odebrání události
    Událost odregistrovat
    Wait-Event

Nakonec přiložte zdrojový kód PS:

Turisté, pokud chcete vidět skrytý obsah tohoto příspěvku, prosímOdpověď





Předchozí:PowerShell metody pro komentáře na jedné řádku, víceřádkové komentáře a blokovací komentáře
Další:PowerShell využívá WebClient ke stažení souborů
Zveřejněno 26.04.2017 14:35:44 |
132432423432423
Zveřejněno 16.04.2019 17:14:12 |
2222222222222
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com