我有ps1脚本来从vmware集群环境中获取一些信息。
在 ps1 脚本的某些地方需要按下 ENTER 按钮。
那么,如何做到这一点?
-谢谢
如果我理解正确的话,您希望 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 键。完整列表可在此处找到:http://msdn.microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx.Sleep 1
语句的原因是等待 1 秒,因为窗口需要一些时间才能激活,如果您立即调用 SendKeys,它会将密钥发送到 PowerShell 窗口,或者发送到任何地方。有时 wscript.shell 的 SendKeys 方法可能有点奇怪,所以如果遇到问题,请将上面的第四行替换为:
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('~');
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}'
@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({'~'})
此外,
$wshell = New-Object -ComObject wscript.shell;
还帮助在后台运行的脚本,只需添加$wshell
即可正常工作。修复了它作为后台运行的问题! [Microsoft.VisualBasic.Interaction]::AppActivate("App Name")