如何在powershell中执行按键操作?

问题描述 投票:0回答:4

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

在 ps1 脚本的某些地方需要按下 ENTER 按钮。

那么,如何做到这一点?

-谢谢

powershell powershell-2.0 vmware powershell-1.0 vmware-server
4个回答
76
投票

如果我理解正确的话,您希望 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 激活的窗口处于活动状态。您可以尝试减少时间,以找到对您的系统足够可靠的最小值(Sleep 接受小数,因此您可以尝试 0.5 半秒)。我发现在我的 2.6 GHz Core i7 Win7 笔记本电脑上,任何小于 0.8 秒的时间都会有很高的故障率。我用1秒来保证安全。
  • 重要警告: 如果您使用此方法发送密码,请格外小心,因为在调用 AppActivate 和调用 SendKeys 之间激活不同的窗口将导致密码发送到该不同的窗口纯文本!

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

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

3
投票
function Do-SendKeys {
    param (
        $SENDKEYS,
        $WINDOWTITLE
    )
    $wshell = New-Object -ComObject wscript.shell;
    IF ($WINDOWTITLE) {$wshell.AppActivate($WINDOWTITLE)}
    Sleep 1
    IF ($SENDKEYS) {$wshell.SendKeys($SENDKEYS)}
}
Do-SendKeys -WINDOWTITLE Print -SENDKEYS '{TAB}{TAB}'
Do-SendKeys -WINDOWTITLE Print
Do-SendKeys -SENDKEYS '%{f4}'

1
投票

@return_value int EXEC将“Enter”键发送到应用程序,例如按“OK”。效果很好:

Add-Type -AssemblyName microsoft.VisualBasic

Add-Type -AssemblyName System.Windows.Forms

#获取想要的进程:

$ProcessName = Get-Process -Name Calculator

开始-睡眠-第 1 秒

# 如果进程确实正在运行,请将其置于前面:

If ($ProcessName)
{
   (New-Object -ComObject.Wscript.Shell).AppActivate((Get-Process $ProcessName -ErrorAction SilentlyContinue).MainWindowTitle)
}

# 将“Enter”键发送到应用程序:

[Microsoft.VisualBasic.Interaction]::AppActivate($ProcessName.ProcessName)
[System.Windows.Forms.SendKeys]::SendWait({'~'})

0
投票

此外,

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

© www.soinside.com 2019 - 2024. All rights reserved.