2013-04-10 200 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