标题: [其他] 批处理远程调用appactivate失败的问题 [打印本页]
作者: xends 时间: 2024-7-4 14:03 标题: 批处理远程调用appactivate失败的问题
诚心求助!本人最近在写远程批量关闭应用的脚本,由于该应用不可强杀,需要触发其关闭后输入密码,故调用了sendkeys去输入密码;然而用命令行触发应用关闭后,由于焦点的偏移,sendkeys无法将密码正确传输到应用中。后来我又使用了appactivate,在输入密码前将焦点转移到应用内,至此在本机上测试成功。然而当我尝试在别的机器上远程start该bat脚本时,发现跟在本机使用脚本不一样,焦点无法转移到应用内。
以下是我部署在远程机器上的,用来关闭该应用的bat脚本:- @if (@CodeSection == @Batch) @then
- ::@echo off
- if "%1"=="h" goto begin
-
- :begin
- SET SendKeys=CScript //nologo //E:JScript "%~F0"
- set /a n=0
-
- for /f "delims=" %%a in ('tasklist^|findstr /i "应用名"') do set /a n+=1
- if %n% gtr 0 goto kill_menu
- if %n% equ 0 goto end
-
-
-
- :kill_menu
-
- for /f "tokens=2" %%i in ('tasklist ^| findstr 应用名') do echo %%i > pid.txt
-
-
- for /f %%a in (pid.txt) do (
-
- if "%%~za" equ "0" (
-
- GOTO end ) else (
-
- taskkill /pid %%a
- )
-
- )
-
- echo CreateObject("WScript.Shell").Appactivate("应用名") > tmp.vbs
- start tmp.vbs
-
- ping 127.0.0.1 > nul
- %SendKeys% "password"
- %SendKeys% "{ENTER}"
- del tmp.vbs
- del pid.txt
- GOTO begin
-
-
-
- @end
- // JScript section
- var WshShell = WScript.CreateObject("WScript.Shell");
- WshShell.SendKeys(WScript.Arguments(0));0
复制代码
最后我是在别的机器上用plink去远程调用上面脚本的:
start "" plink -ssh -pw xxx xxx@192.168.1.13 ".\close.bat"
作者: xends 时间: 2024-7-4 16:54
目前发现,远程触发脚本的情况下,如果程序被最小化,只能在任务栏看到闪烁的标题,不能使其成为当前显示的窗体;而在本机上运行脚本,即使程序被最小化,也能置顶该程序。问题是,为什么远程触发跟本机运行出来的结果会有不同,又要怎样才能让远程触发也能置顶最小化了的程序呢
作者: 77七 时间: 2024-7-4 18:50
回复 2# xends
是不是权限不足?这行代码有管理员权限吗?- CreateObject("WScript.Shell").Appactivate("应用名")
复制代码
作者: buyiyang 时间: 2024-7-4 19:13
回复 2# xends
激活窗口后在发送一个ENTER试试
作者: Five66 时间: 2024-7-4 19:22
说不定是 Appactivate 窗口还原过程中又被其他程序遮挡了吧
试试多试几次 Appactivate
作者: czjt1234 时间: 2024-7-4 22:45
SendKeys 就是个坑
用powershell吧,可以调用API
作者: xends 时间: 2024-7-5 16:30
回复 5# Five66
好像不是,我通过窗口化远程桌面看到,脚本在运行的时候,任务栏在闪烁,只是没有办法将该程序置顶
作者: xends 时间: 2024-7-5 16:32
回复 6# czjt1234
具体的思路可以说一下吗,目前的需求只有两个:1.在taskkill后将触发了关闭的程序置顶 2.对该程序输入指定字符并enter
作者: xends 时间: 2024-7-5 16:36
回复 4# buyiyang
尝试了一下,还是不行,如果窗口本身不是置顶的情况下,只会在任务栏闪烁,而不会置顶对应程序
作者: czjt1234 时间: 2024-7-5 17:08
回复 8# xends
https://demon.tw/copy-paste/vbs-sendmessage.html
这里是vbs用office调用api的示例,实际上就是vba
如果远程电脑上有office,可以参考下
否则到powershell区去问,怎么调用api
GetForegroundWindow 获取当前窗口
SetWindowPos 激活指定窗口
SendWindowMessage 给指定窗口发送消息,不需要是活动窗口
作者: czjt1234 时间: 2024-7-5 17:10
WshShell.AppActivate() 方法
激活指定窗口
WshShell.AppActivate(targe)
参数
targe
要激活的窗口的标题栏,或进程PID
类型:String/Long
标题栏字符串不区分大小写返回值
如果未找到与targe参数匹配的窗口,则返回False
如果找到与targe参数匹配的窗口,且窗口不是最小化状态,则返回True
如果找到与targe参数匹配的窗口,且窗口是最小化状态
则winxp返回True,而win7和win10返回False
类型:Boolean
说明
先查找完全匹配的标题栏
找不到就匹配标题栏左起或右起的字符串
但不会匹配标题栏中间的字符串
例如 targe = "abc"
可以匹配标题栏www.abc或abc.com
但不会匹配www.abc.com
如果找不到匹配的窗口,则不执行任何操作,不会改变当前的活动窗口
如果找到匹配的窗口,则激活窗口一次
但并不保证该窗口一直是活动窗口
所以如果要对激活的窗口进行操作,比如发送按键,可能会被其它激活的窗口打乱
如果找到多个匹配的窗口,则激活最上面的一个窗口
如果匹配的字符串全是数字,则会被认为是进程PID
例如 targe = "123456"
不能匹配标题栏“123456.txt - 记事本”
如果要匹配的是进程PID,也可以不加""
例如:要激活进程PID为2014的进程的窗口,以下2行都可以:
WshShell.AppActivate "2014"
WshShell.AppActivate 2014
如果匹配的窗口是最小化状态,则窗口不会被弹出,还是最小化在任务栏
但窗口会处于激活状态,此时按 Alt + F4 可以关闭该窗口
作者: Five66 时间: 2024-7-5 20:14
试试先置顶窗口 , 然后才 taskkill 看看吧
不过还是试试换成其他程序执行, 对比看看是不是同样的效果(最好是直接远程桌面里执行) ,说不定可能是程序问题
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |