在bat文件运行后关闭Windows应用程序

时间:2014-03-18 18:56:37

标签: windows batch-file cmd

在我的批处理文件中,我打开了一个文件并打印了它的内容。现在我想关闭应用程序。我从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

2 个答案:

答案 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)

你想要实现的是从我的角度直接看,所以我会避免使用代码的setlocalcallexit /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并不是必需的。

希望这有帮助