2013-04-10 201 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不会在实际的用户会话中发送。 – 2013-04-10 14:44:43

回答

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}”)和循环内的PowerShell中的启动 - 休眠功能。 – nivoe 2013-04-15 13:54:30