【问题标题】:Closing a windows application after bat file runsbat文件运行后关闭windows应用程序
【发布时间】:2014-03-18 18:56:36
【问题描述】:

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

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    这是一个 Batch + JScript 混合示例。我添加了几个 2 秒的睡眠时间,以允许目标程序有时间处理请求。通常,应用程序会启动一个单独的打印对话框,因此我将其更改为将回车键发送到打印对话框。

    @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);
    

    【讨论】:

    • 非常感谢。如果你在凤凰城,我会请你喝啤酒
    【解决方案2】:

    从我的角度来看,您想要实现的是直截了当的,所以我会避免使用您的代码中的那些 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
    

    我特意对您的代码进行了 REM,以便更轻松地查看已删除的内容。

    这部分是为了在旧的或桌面操作系统系统上模拟等待/睡眠。

        ping -n 5 localhost > NUL
    

    在服务器系统上,这可以被命令sleep替换。

    似乎它对您不起作用的原因是您实际上在 .vbs 能够打印出来之前杀死了您的程序,因此 sleep 到位,另外如 @987654328 的开头用法所述@ 在如此简单明了的批处理文件中并不是真正需要的。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2011-09-20
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多