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

时间:2013-04-10 14:04:28

标签: powershell batch-file

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

1 个答案:

答案 0 :(得分: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扩展程序保存,您可以双击它以启动它,或通过cmdcscript /nologo scriptfile.js控制台启动它。

我认为切换Scroll Lock比发送Esc更为温和,因为Esc可能会产生不必要的后果,具体取决于SendKeys行触发时应用的焦点。


PowerShell是否可以访问Sleep之类的Windows脚本宿主方法?显然是Start-Sleep。这可能比产生计时器更可取。希望如果我的JScript代码本身不适合您的恶意目的,它至少适合作为PowerShell脚本的伪代码。