如何在powershell中执行击键?

bejyjqdl  于 2023-06-06  发布在  Shell
关注(0)|答案(5)|浏览(869)

我有ps1脚本从vmware集群环境中获取一些信息。
在ps1脚本的某些地方需要按ENTER键。
那么,如何做到这一点?

  • 谢谢
ecbunoof

ecbunoof1#

如果我理解正确的话,您希望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秒的操作都有显著的故障率。我用一秒钟来保证安全。
    ****重要警告:***如果您使用此方法发送密码,请格外小心,因为在调用AppActivate和调用SendKeys之间激活不同的窗口将导致密码以纯文本形式发送到不同的窗口!

有时候wscript.shellSendKeys方法可能有点古怪,所以如果你遇到问题,用下面的代码替换上面的第四行:

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

ioekq8ef2#

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}'
h6my8fg2

h6my8fg23#

向应用程序发送“Enter”键,例如按“OK”。Works great:

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)
}

#向应用发送回车键:

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

rm5edbpk4#

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

am46iovg

am46iovg5#

对于用户名和密码验证后的远程桌面连接,它根据公司策略要求提供警告消息,输入命令不接受它,如何给予它

相关问题