2

我有一个正常运行的 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 中导入一个模块?
4

1 回答 1

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 脚本宿主方法,例如Sleep?显然Start-Sleep也是如此。这可能比生成计时器更可取。希望如果我的 JScript 代码本身不适合您的邪恶目的,它至少适合作为您的 PowerShell 脚本的伪代码。

于 2013-04-10T14:56:00.210 回答