44

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

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

那么,该怎么做呢?

-谢谢

4

3 回答 3

67

如果我理解正确,您希望 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('~');
于 2013-07-25T07:21:16.180 回答
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}'
于 2020-08-23T22:00:04.660 回答
0

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

于 2020-08-12T22:53:48.567 回答