2014-03-18 85 views
1

在我的批處理文件中,我打開了一個文件並打印其內容。現在我正試圖關閉應用程序。我從cmd行使用taskkill/f/im Ptedit50.exe,程序關閉。我無法讓它在批處理文件中工作。當我在打印命令後添加該行時,他們的程序退出並且打印命令從不執行。如果我在批處理文件的末尾插入行,程序不會退出。我應該在哪裏放置taskkill/f/im Ptedit50.exe行?bat文件運行後關閉windows應用程序

@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 

回答

1

這裏是一個批+ JScript混合的例子。我添加了幾秒鐘的睡眠時間,以允許目標程序處理請求。通常,應用程序啓動一個單獨的「打印」對話框,所以我將其更改爲將「輸入」按鍵發送到「打印」對話框。

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

非常感謝。如果你曾經在鳳凰城,我會給你買一瓶啤酒 – Aaron

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 

我特意REM'd你的代碼更容易查看被刪除的內容。

這部分是爲了模擬舊的或桌面操作系統系統的等待/睡眠。

ping -n 5 localhost > NUL 

在服務器系統上,這可以用命令sleep替代。

看來,之所以它不爲你工作是,你實際上已經殺了你的程序的.vbs能夠打印出來之前,因此sleep到位,另外如在setlocal開始使用說明不在這樣直截了當的簡單批處理文件中非常必要。

希望這會有所幫助

相關問題