powershell脚本无法从批处理文件正常运行

powershell脚本无法从批处理文件正常运行,powershell,batch-file,Powershell,Batch File,我有一个功能强大的PowerShell脚本,它注册一个计时器对象,并每隔几分钟发送一个密钥 $wshell = New-Object -ComObject Wscript.Shell ... function fctName { param([ScriptBlock] $action) ... Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier Time

我有一个功能强大的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中,该脚本工作正常,没有任何错误。 但是,我希望从批处理文件中运行它,在该文件中我只写了这一行:

Powershell.exe -noexit C:\...\ScriptName.ps1
不会抛出任何错误,但它不会执行我想要的操作,这是为了防止Windows处于空闲状态

因为I'-noexit'cmd窗口,我可以使用

Unregister-Event -SourceIdentifier Timer.Elapsed
它似乎在工作,因为只需输入两次就会出错

  • 是否我的批处理文件需要不同的代码? 也许是“回声”之类的,我不太熟悉
  • 我是否必须在Powershell中导入模块

我对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
扩展名保存它,您可以双击它来启动它,或者通过
cscript/nologo scriptfile.js
cmd
控制台启动它

我认为切换Scroll Lock比发送Esc更有利,因为Esc可能会产生不必要的后果,这取决于
SendKeys
行触发时哪个应用程序具有焦点



PowerShell是否有权访问Windows脚本主机方法,如
Sleep
?显然是这样。这可能比生成计时器更好。如果我的JScript代码本机不适合您的恶意目的,那么它至少适合作为PowerShell脚本的伪代码。

我认为问题在于,计划任务与登录用户所在的会话/上下文不同。发送密钥不会在实际用户会话中发送。真实情况。仅适用于SendKeys,例如[System.Windows.Forms.SendKeys]::SendWait(“{SCROLLLOCK}{SCROLLLOCK}”)和循环中PowerShell中的启动睡眠函数。