在我的批处理文件中,我打开了一个文件并打印了它的内容。现在我想关闭应用程序。我从cmd行使用了taskkill / f / im Ptedit50.exe,程序关闭。我无法在批处理文件中使用它。当我在打印命令之后添加该行时,程序退出并且打印命令永远不会执行。如果我在批处理文件的末尾插入行,则程序不会退出。我应该在哪里放置taskkill / f / im Ptedit50.exe行?
@echo off
setlocal
title My First batch file
echo Hello!
start Ptedit50.exe "c:\My Labels\PraxisBadge.lbx"
call :SendCtrlP "Name in Windowtitle"
exit /b
:SendCtrlP <app>
setlocal
set vbs=%Temp%\_.vbs
>%vbs% echo set s = CreateObject("Wscript.Shell")
>>%vbs% echo s.appactivate "%~1"
>>%vbs% echo s.sendkeys "^p"
>>%vbs% echo s.sendkeys "{ENTER}"
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%
exit /b
taskkill /f /im Ptedit50.exe
exit /b
enter code here
答案 0 :(得分:1)
这是Batch + JScript Hybrid示例。我添加了几秒钟的睡眠以允许目标程序时间来处理请求。通常,应用程序会启动一个单独的“打印”对话框,因此我将其更改为将“输入按键”发送到“打印”对话框。
@if (@CodeSection == @Batch) @then
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: The first line in the script is...
:: in Batch, a valid IF command that does nothing.
:: in JScript, a conditional compilation IF statement that is false.
:: So the following section is omitted until the next "[at]end".
:: Note: the "[at]then" is required for Batch to prevent a syntax error.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Batch Section
@echo off
:: Open Labels
start Ptedit50.exe "c:\My Labels\PraxisBadge.lbx"
:: Wait 2 Seconds
ping 192.0.2.2 -n 1 -w 2000 >nul
:: Send Ctrl+P and Enter
CScript //E:JScript //Nologo "%~f0" "Name in Windowtitle" "^p"
CScript //E:JScript //Nologo "%~f0" "Print" "~"
:: Wait 2 Seconds
ping 192.0.2.2 -n 1 -w 2000 >nul
:: Kill Program
taskkill /f /im Ptedit50.exe
exit /b 0
:: End of Batch
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@end
////////////////////////////////////////////////////////////////////////////////
// JScript Section
try
{
var WshShell = WScript.CreateObject('WScript.Shell');
var Title = WScript.Arguments.Item(0);
var Message = WScript.Arguments.Item(1);
WshShell.AppActivate(Title);
WshShell.SendKeys(Message);
WScript.Quit(0);
}
catch(e)
{
WScript.Echo(e);
WScript.Quit(1);
}
WScript.Quit(2);
答案 1 :(得分:1)
你想要实现的是从我的角度直接看,所以我会避免使用代码的setlocal
,call
和exit /b
部分,因为没有真正的需要这段代码再次跳转而不是逐行执行代码。
我没有你的应用程序来完全测试它,但是如果我用记事本和文本文件尝试下面的代码对我有效:
@echo off
title My First batch file
echo Hello!
start notepad.exe test.txt
REM call :SendCtrlP "Name in Windowtitle"
:SendCtrlP <app>
REM setlocal
set vbs=%Temp%\my.vbs
>%vbs% echo set s = CreateObject("Wscript.Shell")
>>%vbs% echo s.appactivate "Name in Windowtitle"
>>%vbs% echo s.sendkeys "^p"
>>%vbs% echo s.sendkeys "{ENTER}"
cscript //nologo %vbs%
ping -n 5 localhost > NUL
if exist %vbs% del /f /q %vbs%
REM exit /b
taskkill /f /im notepad.exe
REM exit /b
echo enter code here
pause
我有意识地删除了您的代码,以便更轻松地查看删除的内容。
此部分用于模拟旧版或桌面操作系统上的等待/休眠。
ping -n 5 localhost > NUL
在服务器系统上,可以用命令sleep
替换它。
似乎为什么它不适合你的原因是你之前已经杀了你的程序.vbs能够打印出来,因此sleep
到位并且另外如开头用法中所述在这种直接简单的批处理文件中,setlocal
并不是必需的。
希望这有帮助