2013-04-10 3 views
2

У меня есть действующий скрипт PowerShell, который регистрирует объект таймера и отправляет ключ каждые пару минут.сценарий powershell не работает должным образом из командного файла

$wshell = New-Object -ComObject Wscript.Shell  

... 

function fctName { 
    param([ScriptBlock] $action) 

    ... 

    Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier Timer.Elapsed -Action $action 
} 

fctName { 

    ... 

    $wshell.sendkeys("{ESC}") 
} 

В среде Windows PowerShell ISE скрипт работает нормально, без каких-либо ошибок. Но я хотел бы, чтобы запустить его из пакетного файла, в котором я написал только эту строку:

Powershell.exe -noexit C:\...\ScriptName.ps1 

ошибок не выбрасываются, но это не то, что я хочу, что для предотвращения Windows, происходит в режиме ожидания.

Потому что я -noexit 'окно CMD, я могу легко остановить событие с

Unregister-Event -SourceIdentifier Timer.Elapsed 

Это, кажется, работает, потому что только набрав его дважды выдает ошибку.

  • Может ли быть так, что моему пакетному файлу нужен другой код? Может быть, «эхо» и т. Д. Я не очень хорошо знаком с ним
  • Может быть, мне нужно импортировать модуль в Powershell?
+0

Я думаю, что проблема заключается в том, что запланированные задачи, живущие в другой сессии/контексте, относятся к одному из зарегистрированных пользователей. SendKeys не отправляются в сеансе пользователя. –

ответ

1

Я не то, что удобно с PowerShell, но в JScript вы можете использовать этот код:

var osh = new ActiveXObject("WScript.Shell") 
WSH.Echo(
    /cscript/i.test(WSH.FullName) 
    ? 'Anti-idle running. Hit Ctrl-C to exit' 
    : "Anti-idle running.\nTo stop, use task manager to kill wscript.exe" 
); 
while (1) { 
    WSH.Sleep(120 * 1000); 
    osh.SendKeys("{SCROLLLOCK}{SCROLLLOCK}"); 
} 

Сохранить, что с .js расширением и вы можете дважды щелкните его, чтобы запустить его, или запуск он с консоли cmd через cscript /nologo scriptfile.js.

Я думаю, что переключение Scroll Lock более доброкачественное, чем отправка Esc, поскольку Esc может иметь нежелательные последствия в зависимости от того, какое приложение имеет фокус при запуске линии SendKeys.


ли PowerShell иметь доступ к методам сценариев Windows Script Host, как Sleep? Видимо так с Start-Sleep. Возможно, было бы предпочтительнее нерест таймера. Надеюсь, если мой JScript-код не подходит для ваших злых целей, он по крайней мере будет подходящим для псевдокода для вашего сценария PowerShell.

+0

Настоящая история. Работает только с SendKeys, например [System.Windows.Forms.SendKeys] :: SendWait ("{SCROLLLOCK} {SCROLLLOCK}") и функцией Start-Sleep в PowerShell в цикле. – nivoe

Смежные вопросы