이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 10956|회답: 3

PowerShell은 .net을 호출하고 이벤트에 구독합니다 [소스 코드]

[링크 복사]
게시됨 2017. 1. 17. 오후 5: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 이름 상태 HasMoreData Location 명령어
    --    ----            -----      -----------     --------             -------
    2 422cfe5a-65e... 트루 뉴 이벤트 "PowerShe...
   
    이 예시는 이벤트에 대응하기 위한 행동을 명시하는 방법을 보여줍니다. 액션을 지정하면 발생한 이벤트는 이벤트 큐에 추가되지 않습니다. 대신, 행동은 사건에 반응합니다.

이 예시에서, 새로운 프로세스가 시작되었음을 나타내는 인스턴스 생성 이벤트가 발생하면, 새로운 ProcessCreated 이벤트가 발생합니다.

이 액션은 $Sender 및 $EventArgs 자동 변수를 사용하며, 이는 이벤트 액션에만 사용됩니다.

Register-ObjectEvent 명령어는 해당 작업을 나타내는 작업 객체를 반환하며, 이 작업은 백그라운드 작업으로 실행됩니다. Get-Job, Receive-Job 같은 Job cmdlet을 사용해 백그라운드 작업을 관리할 수 있습니다.

자세한 내용은 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 "__ 인스턴스생성이벤트", '
       (새로운 객체 타임스팬 0,0,1), '
       "TargetInstance isa 'Win32_Process'" $ProcessWatcher = New-Object System.Management.ManagementEventWatcher $Query $Identifier = "WMI. ProcessCreated" Register-ObjectEvent -입력 $ProcessWatcher -EventName "EventArrived" '
       -SourceIdentifier $Identifier -MessageData "Test" -forward}EnableProcessCreationEvent
   
    이 예시는 원격 컴퓨터에서 객체 이벤트에 구독하는 방법을 보여줍니다.

첫 번째 명령어는 두 대의 원격 컴퓨터에서 PSSessions를 생성하고 $S 변수에 저장합니다.

두 번째 명령어는 Invoke-Command cmdlet의 FilePath 매개변수를 사용하여 각 PSSessions in $S에서 ProcessCreationEvent.ps1 스크립트를 실행합니다.

스크립트에는 ManagementEventWatcher 객체와 EventArrived를 통해 Win32_Process 객체의 인스턴스 생성 이벤트에 구독하는 Register-ObjectEvent 명령어가 포함되어 있습니다 행사.
    예시 4: PSEventJob 객체의 동적 모듈 사용
    PS C:\>$Timer = 새로운 객체 타이머.타이머
    PS C:\>$Timer.간격 = 500
    PS C:\>$Job = Register-ObjectEvent -InputObject $Timer -EventName 경과 -SourceIdentifier Timer.Random -Action {$Random = Get-Random -Min 0 -Max 100}
    PS C:\>$Job.gettype().fullnameSystem.Management.Automation.PSEventJob
    추신 C:\>$Job | Format-List -Property *
    상태:
    러닝모듈 : __DynamicModule_6b5cbe82-d634-41d1-ae5e-ad7fe8d57fe0
    상태 메시지 :
    HasMoreData : 맞아요
    위치 :
    명령어 : $Random= Get-Random -Min 0 -Max 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을 사용하여 타이머 객체를 생성합니다. 두 번째 명령어는 타이머의 간격을 500(밀리초)으로 설정합니다.

세 번째 명령어는 Register-ObjectEvent cmdlet을 사용하여 타이머 객체의 경과 이벤트를 등록합니다. 명령어에는 이벤트를 처리하는 액션이 포함되어 있습니다. 타이머 간격이 지나면 이벤트가 발생하고 액션 내 명령이 실행됩니다. 이 경우 Get-Random cmdlet은 0에서 100 사이의 난수를 생성하여 $Randomvariable에 저장합니다.

Register-ObjectEvent 명령어에서 Action 매개변수를 사용하면 해당 동작을 나타내는 PSEventJob 객체를 반환합니다. 이 명령어는 작업 객체를 $Job 변수에 저장합니다.

Register-ObjectEvent 명령어가 반환하는 PSEventJob 객체는 이벤트 구독자의 Action 속성에서도 사용할 수 있습니다. 자세한 내용은 Get-EventSubscriber를 참조하세요.

네 번째 명령어는 $Job 변수에 PSEventJob 객체가 포함되어 있음을 보여줍니다. 다섯 번째 명령어는 Format-List cmdlet을 사용하여 PSEventJob 객체의 모든 속성을 리스트에 표시합니다.

PSEventJob에는 동작을 구현하는 동적 스크립트 모듈이 포함된 모듈 속성이 있습니다.

여섯 번째 명령어가 타이머를 활성화합니다.

나머지 명령어들은 호출 연산자(&)를 사용하여 모듈에서 명령을 호출하고 $Random 변수의 값을 표시합니다. 호출 연산자를 사용해 모듈 내 모든 명령어를 호출할 수 있으며, 내보내지 않은 명령도 포함됩니다. 이 경우, 명령어는 경과 이벤트가 발생했을 때 생성되는 무작위 수를 보여줍니다.

모듈에 대한 자세한 내용은 about_Modules를 참조하세요.


관련 링크
    온라인 버전: http://go.microsoft.com/fwlink/?LinkId=821845
    이벤트를 얻어
    신규 사건
    레지스터-엔진이벤트
    Register-WmiEvent
    제거 이벤트
    이벤트 취소
    대기 이벤트

마지막으로 PS 소스 코드를 첨부하세요:

관광객 여러분, 이 게시물의 숨겨진 내용을 보고 싶으시다면 부탁드립니다회답





이전의:단일 줄 주석, 다중 줄 주석, 블록 주석에 대한 PowerShell 메서드
다음:PowerShell은 WebClient를 이용해 파일을 다운로드합니다
게시됨 2017. 4. 26. 오후 2:35:44 |
132432423432423
게시됨 2019. 4. 16. 오후 5:14:12 |
2222222222222
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com