如何在powershell内执行击键?

时间:2013-07-25 05:12:55

标签: powershell powershell-v2.0 vmware powershell-v1.0 vmware-server

我有ps1脚本从vmware集群环境中获取一些信息。

在ps1脚本的某个位置需要 ENTER 按钮按键。

那么,怎么做?

-Thanks

3 个答案:

答案 0 :(得分:39)

如果我理解正确,您希望PowerShell将 ENTER 键击发送到某个交互式应用程序吗?

$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('title of the application window')
Sleep 1
$wshell.SendKeys('~')

如果该交互式应用程序是PowerShell脚本,只需使用PowerShell窗口标题栏中的任何内容作为 AppActivate 的参数(默认情况下为powershell.exe的路径)。为避免歧义,您可以使用title 'new window title'命令让脚本重新命名自己的窗口。

一些注意事项:

  • 代字号(〜)代表 ENTER 键击。您也可以使用{ENTER},虽然它们不相同 - 这是键盘的 ENTER 键。完整列表可在此处获取:http://msdn.microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx
  • Sleep 1语句的原因是等待1秒,因为窗口激活需要一些时间,如果您立即调用 SendKeys ,它会将密钥发送到PowerShell窗口,或无处可见。
  • 请注意,如果您键入任何内容,或者在等待的第二个鼠标期间单击鼠标,则会触发此操作,从而阻止您通过 AppActivate 激活窗口。您可以尝试减少在系统上找到可靠充分的最小值的时间(睡眠接受小数,因此您可以尝试.5半秒)。我发现在我的2.6 GHz Core i7 Win7笔记本电脑上,任何小于.8秒的内容都有很大的故障率。我使用1秒钟是安全的。
  • 重要警告: 如果您使用此方法发送密码,请格外小心,因为在调用 AppActivate <之间激活不同的窗口/ strong>并调用 SendKeys 将导致密码以纯文本形式发送到该不同的窗口!

有时 wscript.shell SendKeys 方法可能有点古怪,所以如果遇到问题,请将上面的第四行替换为:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('~');

答案 1 :(得分:1)

for possible_key in range(3, 8):
    print(dictionary.get(possible_key, 'missing value'))

答案 2 :(得分:0)

此外,$wshell = New-Object -ComObject wscript.shell;帮助了一个在后台运行的脚本,只需添加$wshell即可正常工作。修复了它无法作为背景运行的问题! [Microsoft.VisualBasic.Interaction]::AppActivate("App Name")