0

我有多个 VBS 文件(每个文件打开一个不同的文件,同一个程序),我想打开它们而不必单击所有文件。如果我使用我创建的 python 脚本并使用 Notepad++ 中的 NPPExec 执行,我可以让它们毫无问题地打开。我希望文件打开的方式(使用前面所述的方法)是打开程序+文件->敲击一些键盘敲击->重复。我遇到的问题是,当我双击 python 文件时,它只会打开程序+第一个文件-> 进行键盘敲击,然后对于以下文件,它只会打开程序。我相当肯定这个问题是由于当 VBS 脚本通过击键时没有焦点正确的窗口引起的,它们没有在正确的窗口上执行。我也有一个批处理文件,我也试过了,

打开程序+文件的VBS文件->按键 我尝试使用App.Activate没有运气

Dim objShell
Set objShell = WScript.CreateObject( "WScript.Shell" )
objShell.Run """C:\Program Files (x86)\Program\Program.exe""" & """C:\temp_folder\file.ext"""
objShell.AppActivate """C:\Program Files (x86)\Program\Program.exe"""
WScript.Sleep 3000
objShell.SendKeys "{TAB}"
objShell.SendKeys "{TAB}"
objShell.SendKeys "{UP}"
objShell.SendKeys "{TAB}"
objShell.SendKeys "{DOWN}"
objShell.SendKeys "{ENTER}"

用于打开多个 VBS 文件的 Python 代码按 我想要的方式工作,但前提是从 Notepad++ 和 NPPExec 运行 双击 python 脚本不能以正确的方式工作

import os
import time
import subprocess
alfs = []
for file in os.listdir(os.getcwd()):
    if file.endswith(".ext"):
        alfs.append(file)

for f, item in enumerate(alfs):
    subprocess.call('cmd /c %s'%alfs[f])    
    time.sleep(2)

打开多个 VBS 文件 的批处理文件我正在通过双击运行批处理文件,结果类似于 Python 双击方法。

for /r "." %%a in (*.vbs) do %%~fa

我主要是拼凑我发现的代码,让它按我想要的方式工作。我对 Python 非常了解,但我对 VBS 和 Batch 完全陌生。

4

2 回答 2

1

AppActivate 方法参考:

激活应用程序窗口。

  • 句法:object.AppActivate title
  • 论据:
    • 对象WshShell对象。
    • title:指定要激活的应用程序。这可以是一个字符串,其中包含应用程序的标题(在标题栏中显示)或应用程序的进程 ID

确保提供给的字符串objShell.AppActivate所需实例的标题Program.exe或其Process ID

除了SendKeys 方法参考,请阅读将击键发送到程序。本文解释了您的 任何脚本的根本不足 - 时间问题:

您应该知道,将击键发送到应用程序并不是自动化过程的最佳方法。如果您的企业中有一个需要自动化的应用程序并且它没有基于 COM 的对象模型,那么您可能会考虑这种技术。但是,您应该首先检查是否存在用于自动化该特定应用程序的其他方法。

虽然SendKeys可以有效地使用,但这种方法存在几个潜在问题:

  • 该脚本可能难以确定将击键发送到哪个窗口。
  • 由于应用程序在 GUI 模式下运行,用户可能会过早关闭应用程序。不幸的是,这不会终止脚本,并且脚本最终可能会将击键发送到错误的应用程序
  • 脚本可能难以与应用程序同步

这个计时问题特别麻烦,因为脚本往往比 GUI 应用程序运行得快得多。
…</p>

使用AppActivate

在向应用程序发送击键之前,您必须首先确保应用程序正在运行并且焦点在应用程序上(即应用程序正在活动窗口中运行)。

您可以将您的脚本放在一个循环中,定期调用 AppActivate 直到返回值为 True。此时,应用程序已加载并准备好接受击键。
…<BR>当脚本决定激活哪个应用程序时,给定的标题会与屏幕上可见的每个窗口的标题进行比较。如果不存在完全匹配,则该AppActivate方法将焦点设置到标题以给定文本开头的第一个窗口. 如果仍然找不到窗口,则标题字符串以文本结尾的第一个窗口将获得焦点。与标题栏的前导和尾随文本的部分匹配确保了AppActivate适用于在标题栏上显示当前打开的文档名称的应用程序,例如记事本。(例如,当您第一次启动时 Notepad,窗口标题是Untitled - Notepad,而不是Notepad。)
...<BR>

(以上引用仅是我强调的摘要:太长,无法在此处引用整篇文章。)

编辑.

让我们正视该SendKeys方法将击键发送到看不见的活动窗口视线,因为实际上我们永远不知道当前聚焦哪个窗口。利用运行方法(Windows 脚本宿主)的完整语法objShell.Run sCmdLine, 1, False,其中窗口样式1的含义是

  • 1 激活并显示一个窗口。如果窗口被最小化或最大化,系统会将其恢复到原来的大小和位置。应用程序在第一次显示窗口时指定此标志。

使用下一个示例脚本进行了测试(为了更好地理解而进行了评论):

option explicit
On Error GoTo 0

Dim objShell, sProgram, sTxtFile, sTxtPath, sCmdLine, sTxtExists
Set objShell = WScript.CreateObject( "WScript.Shell" )

sProgram = "C:\Windows\System32\notepad.exe" 
sTxtFile = Replace( Wscript.ScriptName, ".vbs", ".txt", 1, -1, vbTextCompare)
sTxtPath = CreateObject("Scripting.FileSystemObject").BuildPath( _
             objShell.ExpandEnvironmentStrings("%temp%"), sTxtFile)
sTxtExists = CreateObject("Scripting.FileSystemObject").FileExists(sTxtPath)

    ' delete file merely for testing and debugging to ensure that 
    '             `NOTEPAD` will ask whether create nonexistent file
If sTxtExists Then CreateObject("Scripting.FileSystemObject").DeleteFile( sTxtPath)
WScript.Sleep 500                       ' wait for deleting

sCmdLine = """" & sProgram & """ """ & sTxtPath & """"
objShell.Run sCmdLine, 1, False
              '  this `1` activates currently launched notepad
              '           and its possible initial dialogue takes focus
WScript.Sleep 1000      ' hence, `AppActivate` is not necessary

                                  ' alternative to `DeleteFile( sTxtPath)`
' If NOT sTxtExists Then          ' answer initial dialogue only if necessary  
    objShell.SendKeys "{TAB}"
    WScript.Sleep 100
    objShell.SendKeys "{TAB}"
    WScript.Sleep 100
    objShell.SendKeys "{TAB}"
    WScript.Sleep 100
    objShell.SendKeys "{ENTER}"
    WScript.Sleep 100
' End If
objShell.SendKeys Cstr(Now)
WScript.Sleep 100

但是,您的启动器中还有另一个时间焦点问题。Pythontime.sleep(2)就足够了吗?当然不是:每个vbs脚本在第一个脚本之前等待 3 秒,SendKeys但下一个脚本每 2 秒启动一次!

等效的批处理脚本:Timeout命令将命令处理器暂停指定的秒数。
尾随1>NUL隐藏输出倒计时Waiting for X seconds, press CTRL+C to quit ...

for /r "." %%a in (*.vbs) do (
    C:\Windows\System32\wscript.exe "%%~fa"
    timeout /T 5 /NOBREAK 1>NUL
)

5秒就够了吗?

于 2016-06-14T16:36:49.283 回答
0

从 DOS BATCH 的角度来看,这应该可以帮助您:

FOR %%G IN (file1.txt file2.txt file3.txt) DO start notepad.exe %%G

您可以进行必要的修改来处理 VBS 文件。

于 2016-06-14T15:37:23.630 回答