首页 文章

批处理文件调用控制台应用程序 - 保持CMD窗口打开

提问于
浏览
1

我通过批处理文件调用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"

4 回答

  • 0

    试试这个(注意 echo 之后的整理点):

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

    我试过 pause 并且效果很好:

    echo.| pause
    

    echo. 不是 echo . 它只是打印一个换行符,就是触发暂停所需的内容 .

  • 0

    如果您的控制台应用程序已经有一个 Console.ReadLine()Console.ReadKey() 方法,而不是仅仅调用 *.exe ,而不是仅使用Start命令,它将在单独的窗口中运行可执行文件

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

    如果您无法访问控制台应用程序源代码,则可以尝试解决方法

    @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
    

    等待logfile关闭,因此它可能表示上一个进程已经结束 .

    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等待技巧才能正常工作 . 注意:此处讨论了调用和/或转到技巧

  • 0

    我们必须在这里模拟按键,因此我们应该使用键盘缓冲区 .

    我不是批处理专家,这是我找到的搜索如何按批次按键的答案:

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

    资源:

相关问题