gpt4 book ai didi

linux - VBA SendKeys 到特定窗口

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:15 25 4
gpt4 key购买 nike

我有一个汇总服务器使用情况的电子表格。电子表格引用了一个文本文件,当我让 VBA 通过 Windows 命令提示符(和 Cygwin)向 Linux 服务器发送一些命令时,该文件被更新。我的问题是,我发现在 Cygwin 中执行命令的唯一方法是通过 SendKeys 命令。这会导致两个问题:

  1. 我必须相信,在脚本运行完成之前,用户不会点击某处。
  2. 我必须硬编码在发送下一个命令之前等待命令执行的时间量。

我会(并且确实)尝试创建一个 bash 文件以在 Cygwin 中运行,但我不知道有什么方法可以让用户输入密码来登录 Linux 服务器。我目前正在从执行主代码之前运行的用户窗体获取用户密码。然后将此密码保存到一个“非常隐蔽”的工作表中,该工作表会在应用程序关闭时被删除。

我目前正在使用以下脚本来运行命令:

Public Sub test()
' Declare Variables
Dim cmd As String
Dim ret As Double
Dim LastRow As Integer
Dim PssWrd As String

PssWrd = Worksheets("PssWrd").Range("A1").Value

' Run Linux Commands
cmd = "C:\cygwin\Cygwin.bat"
ret = Shell(cmd, vbMinimizedFocus)
wait 0.02
cmd = "ssh " & Worksheets("Settings").Range("LOGIN") & "~" ' Format: user@hostname
SendKeys cmd
cmd = PssWrd & "~"
SendKeys cmd
wait 2.78
cmd = "{(} date ; fs ; qstat ; date {)} > & zout &~"
SendKeys cmd
cmd = "exit~"
SendKeys cmd
wait 0.5
cmd = "exit~"
SendKeys cmd
wait 5
' Update PivotTable and other data
End Sub
Public Sub wait(PauseTime As Double)
Dim Start As Double
Dim Finish As Double
Dim TotalTime As Double
Start = Timer ' Set start time
Do While Timer < Start + PauseTime
DoEvents ' Yield to other processes
Loop
Finish = Timer ' Set end time
TotalTime = Finish - Start ' Calculate total time
End Sub

有没有办法至少将击键发送到特定窗口,而不仅仅是事件窗口?我们将不胜感激任何帮助,我们将随时提供任何额外的必要信息。

最佳答案

好的。我想我找到了解决方案。感谢所有帮助 (@anishsane) 为我指明正确的方向!这是我更新的代码:

Public Sub test()
' Declare Variables
Dim cmd As String
Dim ret As Double
Dim LastRow As Integer
Dim PssWrd As String
Dim WshShell As Object
Dim plink_object As Object

PssWrd = Worksheets("PssWrd").Range("A1").Value

' Run Linux Commands
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
Set plink_object = WshShell.Run("""C:\Program Files (x86)\PuTTY\plink.exe"" -ssh " & Worksheets("Settings").Range("LOGIN") & " -pw " & PssWrd & " ""(date; fs; qstat; date) > &zout&""", 7, True)
On Error GoTo 0
' Update PivotTable and other data
End Sub

显然,在 VBA 中不需要 WScript。此外,wshshell.exec 似乎有时会失败,因为命令从未执行过(尽管 PuTTY/Plink 已启动)。出于某种原因,WshShell.Run 命令导致“运行时错误‘424’:需要对象”错误,但命令的基本部分仍能正确执行,所以我只需要错误被忽略。我还想出了如何在一行中执行我的所有命令,这样我就不必担心以前不起作用的 stdIn.Write 命令。我可以使用 Shell() 命令,但我需要确保该命令已完成执行(通过 bWaitOnReturn 选项)以确保我有最多的-更新脚本运行时的最新文件。话虽如此,我相信因为我让 Linux 将命令的输出写到一个文件中,所以当 VBA 说命令已完成执行时,文件还没有完成更新。但是,我相信我已经想出了一种方法来检查文件中最后一行文本的格式是否正确(因为它应该是日期),所以这应该不是问题。

关于linux - VBA SendKeys 到特定窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20998055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com