簡體   English   中英

批處理文件調用控制台應用程序 - 使 CMD 窗口保持打開狀態

[英]Batch File calling Console Application - Leaves CMD window open

我正在通過批處理文件調用 C# 控制台應用程序,以便將應用程序輸出發送到帶有日期/時間等的文本文件中。

我遇到的問題是,當控制台應用程序完成時,它使批處理窗口保持打開狀態,因為有一個 PAUSE(C# 等效項),因此必須按下一個鍵才能關閉窗口。 這意味着我不知道工作何時完成。

有沒有辦法在應用程序完成時關閉 CMD 窗口,而不必更改 C# 應用程序代碼?

@ECHO================================================================================
@ECHO The Application is currently running and may take some time. Please wait...
@ECHO================================================================================
@ECHO OFF

C:\Applications\Job\Job.exe > C:\Applications\Job\Job_Output\"Output_%date:/=-% %time::=-%.txt"

試試這個(注意echo之后的整理點):

echo.| C:\Applications\Job\Job.exe > C:\Applications\Job\Job_Output\"Output_%date:/=-% %time::=-%.txt"

我試過pause ,效果很好:

echo.| pause

echo. 不是echo 它只是打印一個換行符,這正是觸發暫停所需的內容。

如果您的控制台應用程序已經有Console.ReadLine()Console.ReadKey()方法,則不確定它是否可以工作,但不是僅調用*.exe而是使用Start命令,該命令將在單獨的窗口中運行可執行文件,例如

start "MyConsoleTask" C:\Applications\Job\Job.exe > C:\Applications\Job\Job_Output\"Output_%date:/=-% %time::=-%.txt"

如果您無法訪問控制台應用程序源代碼,您可以嘗試一種解決方法

@echo off
@echo================================================================================
@echo The Application is currently running and may take some time. Please wait...
@echo================================================================================

set "timeStamp=%date:/=-%_%time::=-%
set "timeStamp=%timeStamp:~0,-3%"      & rem remove ,centiseconds.

set "logFile=C:\Applications\Job\Job_Output\Output_%timeStamp%.txt"

rem start the exe in the same cmd window
start /B "" """C:\Applications\Job\Job.exe" > "%logFile%"""

rem wait for process startup
ping 1.1.1.1 -n 1 -w 750 >NUL

rem wait for logFile to be closed. This may flag that job.exe has ended
:wait
ping 1.1.1.1 -n 1 -w 50 >NUL & rem this avoids processor load
2>nul (>>"%logFile%" call )||goto :wait

rem send a key to the console. This may be captured by the exe file
set "_vbs_file_=%TEMP%\sendConsole.vbs"
(
  echo/ set oWS ^= CreateObject^("wScript.Shell"^)
  echo/ wScript.Sleep 50
  echo/ oWS.SendKeys "{ENTER}"
)>"%_vbs_file_%"
if exist "%TEMP%\sendConsole.vbs" (set "_spawn_=%TEMP%\sendConsole.vbs") else (set "_spawn_=sendConsole.vbs")
ping 1.1.1.1 -n 1 -w 50 >NUL
start /B /WAIT cmd /C "cls & "%_spawn_%" & del /F /Q "%_spawn_%" 2>NUL"

@echo================================================================================
@echo Process completed. I guess...
@echo================================================================================

exit/B

所以,

start /B ...

在同一個 cmd 窗口中啟動job.exe 可執行文件

:wait
ping 1.1.1.1 -n 1 -w 50 >NUL & rem this avoids processor load
2>nul (>>"%logFile%" call )||goto :wait

等待直到日志文件關閉,所以它可能表明前一個過程已經結束。

set "_vbs_file_=%TEMP%\sendConsole.vbs"
(
  echo/ set oWS ^= CreateObject^("wScript.Shell"^)
  echo/ wScript.Sleep 50
  echo/ oWS.SendKeys "{ENTER}"
)>"%_vbs_file_%"
if exist "%TEMP%\sendConsole.vbs" (set "_spawn_=%TEMP%\sendConsole.vbs") else (set "_spawn_=sendConsole.vbs")
ping 1.1.1.1 -n 1 -w 50 >NUL
start /B /WAIT cmd /C "cls & "%_spawn_%" & del /F /Q "%_spawn_%" 2>NUL"

將回車鍵發送到控制台,因此等待擊鍵的進程可能會捕獲它。

注意:只有當 IP 無法訪問時, ping 等待技巧才能正常工作。

注意:這里討論了調用和/或轉到技巧

我們必須在這里模擬按鍵,因此我們應該玩弄鍵盤緩沖區。

我不是批處理專家,這是我在搜索如何使用批處理按鍵時找到的答案:

@if (@CodeSection == @Batch) @then
@echo off
set SendKeys=CScript //nologo //E:JScript "%~F0"
rem Open the command here
start "" /B Job.exe > JobOutput.txt
rem sends the keys composing the string "I PRESSED " and the enter key
%SendKeys% "I PRESSED {ENTER}"
goto :EOF

@end

// JScript section
WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));

來源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM