2015-01-21 2 views
0

У меня возникла проблема с запуском скрипта Powershell ниже в консоли.Powershell Register-Object

function startMonitor { 

    $null = Register-ObjectEvent -InputObject ([Microsoft.Win32.SystemEvents]) -EventName "SessionSwitch" -Action { 
    switch($event.SourceEventArgs.Reason) { 
    'SessionLock'  
    { 
     ---------do something---- 
    }  
    'SessionUnlock' 
    { 
     --------do something---- 
    } 
    } 
    } 
} 
startMonitor 

Когда я запускаю его в PowerShell ISE, он работает нормально, а выход - как ожидается. Когда сеанс заблокирован или разблокирован, вывод генерируется отлично.

Но я хочу запустить это как скрипт, который запускается во время входа в систему.

Я поставил этот скрипт в папку автозагрузки, как

powershell.exe -noexit -windowstyle hidden "E:\sources\lock.ps1" 

Скрипт работает нормально. Но он не генерирует результат (другие функции в этом коде генерируют выход правильно, кроме этой функции). Когда я пытаюсь команду (без переключателя -windowstyle):

Get-EventSubscriber 

показывает, что событие регистрируется.

Как запустить этот скрипт с помощью powershell.exe -noexit?

Я не могу использовать планировщик задач для этой цели из-за ограничений в моей среде.

+0

Какой команды вы используете для создания вывода? –

+0

Вывод - это просто текст, передаваемый в текстовый файл. – GGTS

ответ

1

Для того, чтобы работать в фоновом режиме, вы должны держать его в пределах цикла и проверьте события, тест с этим небольшим примером ...

[System.Reflection.Assembly]::LoadWithPartialName("System.Diagnostics") 
# ------ init ------ 
function Start-mySession { 
$null = Register-ObjectEvent -InputObject ([Microsoft.Win32.SystemEvents]) -EventName "SessionSwitch" -Action { 
add-Type -AssemblyName System.Speech 
$synthesizer = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer 
switch($event.SourceEventArgs.Reason) { 
    'SessionLock' { $synthesizer.Speak("Lock!") } 
    'SessionUnlock' { $synthesizer.Speak("Unlock!") } 
    } 
    } 
} 

# ------ stop ------ 
function End-mySession { 
    $events = Get-EventSubscriber | Where-Object { $_.SourceObject -eq [Microsoft.Win32.SystemEvents] } 
    $jobs = $events | Select-Object -ExpandProperty Action 
    $events | Unregister-Event 
    $jobs | Remove-Job 
} 

# ===== keep process in alive for 10 hours ===== 
[TimeSpan]$GLOBAL:timeout = new-timespan -Hours 10 
$GLOBAL:sw = [diagnostics.stopwatch]::StartNew() 
while ($GLOBAL:sw.elapsed -lt $GLOBAL:timeout){ 
    [Array]$GLOBAL:XX_DEBUG_INFO += "DEBUG: initialize debug!" 
    # Loop 
    Start-mySession 
    start-sleep -seconds 10 
    #.. do something, or check results 
    End-mySession 
    } 
# teardown after timeout 
Write-Output "INFO: $(get-date -format "yyyy-MM-dd:HH:mm:ss") : $env:USERNAME : Timeout (logout/timout)" 
End-mySession 
Смежные вопросы