2016-01-29 159 views
0

对不起,杂乱的标题。输入一个批处理文件并将该输入输出到另一个批处理文件

我想高效地从另一个批处理文件/窗口(例如:批处理文件中的选择命令)输入并将其发送到另一个批处理文件。基本上它会在另一个窗口中“键入”它。现在,我不能只是第一批文件中打开一个新的,因为如果我这样做,我只想打开另一个Java实例

第一批文件中的代码:

:menu 
cls 
echo. 
echo Please select option using keys 1 or 2: 
echo. [1] Start server 
echo. [2] Stop server 
echo. [3] Say "hi"! 
choice /C 12 /N 
if %errorlevel%==1 goto start-server 
if %errorlevel%==2 goto stop-server 
if %errorlevel%==3 goto test-command 
goto menu 

:start-server 
echo Starting server... 
start start.bat 
pause 
goto menu 

:stop-server 
echo Stopping server 
echo stop > task start.bat 
pause 
goto menu 

:test-command 
echo say hi > task start.bat 
pause 
goto menu 

代码第二批处理文件:

@echo off 

java -Xms1024M -Xmx2048M -jar spigot_server.jar 
pause 

喜欢的东西echo stop > task start.bat

有没有人对我怎样才能做到这一点任何想法?我愿意为第一个文件使用除批处理以外的任何内容(因为第二个文件要求它是批处理脚本),但我不想下载任何内容。

+0

http://superuser.com/questions/764392/sending-input-to-command-line-program-from-text-batch-file此问题的第一个答案建议“VBScript.SendKeys” – lessthanideal

+1

您是否尝试过使用[参数](http://ss64.com/nt/syntax-args.html)? –

回答

1

我假设你的Java服务器是接受重定向标准输入输入一个控制台进程。我还假设你的服务器进程将从文件中读取并终止输入文件时终止。我也假设你不想修改你的java代码。

您不能使用管道在两个窗口之间进行通信。但是你可以使用一个文件。

您的母版批处理脚本可以将命令写入服务器读取的输入文件。但服务器无法直接读取命令。需要发送者批处理脚本将命令中继到服务器。

主脚本通过启动重定向到输入文件输入发送脚本启动服务器,并发送脚本输出管道输送到你的服务器进程。

发送脚本是一个重复使用FOR/F通过FINDSTR读取输入文件的循环。 FINDSTR读取stdin(已被重定向到输入文件)。这起作用的原因是因为FINDSTR在每次调用时都不重置文件指针。如果没有新的命令,则它不返回任何内容。但是,如果一行已被添加到输入文件,那么FINDSTR会将其选中。

添加到输入文件的每个命令由两个由冒号分隔的部分组成。

  • 用于发送批处理脚本
    • GO命令告诉发送脚本是服务器正常命令
    • EXIT告诉发送脚本,它应该关闭
  • 服务器的命令

我选择到主脚本和发件人SCR相结合ipt到单个脚本中。该脚本通过使用:send参数调用自身来启动发件人。如果第一个参数是:send,那么它分支到发送者代码。

我没有你的Java服务器代码。所以出于演示目的,我使用cmd.exe作为我的“服务器”。显然,我的菜单中的命令适用于cmd.exe。你可以替换你的java程序并适当地改变命令。

注意,在启动时,服务器窗口会自动偷焦点。您必须单击父窗口才能重新获得焦点,以便输入命令。

@echo off 
if "%~1" equ ":send" goto :send 

setlocal 
set "inputFile=input.txt" 
set "serverCommand=cmd.exe" 

:initMenu 
echo(
echo Press one of the option keys 
echo [S] Start server 
echo [Q] Quit 
choice /c SQ /n 
if errorlevel 2 exit /b 
echo Starting server... 
echo(
echo You must click on this main window to regain focus. 
copy nul "%inputFile%" >nul 
start "" cmd /c ""%~f0" :send <"%inputFile%" | cmd" 
call :menu 
echo Server stopped 
goto :initMenu 

:menu 
echo Press one of the option keys 
echo [D] Date 
echo [T] Time 
echo [P] Ping 
echo [S] Stop server 
choice /c DTPS /N 
>>"%inputFile%" (
    if errorlevel 4 (
    echo exit:exit 
    exit /b 
) else if errorlevel 3 (
    echo go:ping /n 5 localhost 
) else if errorlevel 2 (
    echo go:time /t 
) else (
    echo go:date /t 
) 
) 
echo(
goto :menu 

:send 
for /f "delims=: tokens=1*" %%A in ('findstr "^"') do (
    echo(%%B 
    if /i %%A equ exit %%A 
) 
goto :send 

请注意:send例程持续轮询stdin,因此它将挂接近100%的处理器(或处理器内核)。您可以在循环中添加PING延迟,以便它不占用CPU资源,但是服务器将不会如此响应。


如果您的服务器进程在到达重定向输入结束时不会自动终止,那么您不需要发送方批处理进程。你根本就您的主脚本中使用

start cmd /c ""yourServerCommand <"%inputFile%"" 

启动您的服务器,或者是目前终止在到达文件的末尾,但你愿意修改服务器代码,那么你仍然可以做上面。您可以修改您的java代码以连续轮询输入,如果不在文件结尾处,只读取一行。该进程只会在收到某种类型的退出命令时才会终止。


如果您的服务器不是一个控制台进程,那么你就需要像AutoIt将命令发送到您的服务器窗口。或者你可以用VBScript或JScript和SendKeys method推出自己的解决方案。

即使你的服务器进程是一个控制台程序,你可能仍然要使用AutoIt的或的SendKeys,因为它是更直截了当。

+2

我只能假设我已经收到报复downvote。 – dbenham

+0

落后是因为你的回答太冗长,因为我的解释是一个简单的问题,并且基于假设。 –

+0

@DevilsAdvocate,内容量没有投票标准;请仅依靠质量! – aschipfl

-2

这是一个使用参数的方法,正如@ Dennis van Gils所建议的。

FIRST.BAT

@echo off 
:menu 
cls 
echo. 
echo Please select option using keys 1 or 2: 
echo. [1] Start server 
echo. [2] Stop server 
echo. [3] Say "hi"! 
choice /C 123 /N 
if %errorlevel%==1 goto start-server 
if %errorlevel%==2 goto stop-server 
if %errorlevel%==3 goto test-command 
goto menu 

:start-server 
second.bat start 
goto menu 

:stop-server 
second.bat stop 
goto menu 

:test-command 
second.bat hi 
goto menu 

SECOND.BAT

@echo off 
if "%1"=="start" (
    echo Starting Server... 
    rem java -Xms1024M -Xmx2048M -jar spigot_server.jar 
) 

if "%1"=="stop" (
    echo Stopping Server... 
) 

if "%1"=="hi" (
    echo Hi there! 
) 
+0

这在许多层面完全失败。 – dbenham

+0

@dbenham心中至少解释了其中一个关卡?我测试了这个,它工作得很好。 –

+1

FIRST.BAT在没有CALL的情况下执行SECOND.BAT,因此它永远不会返回到FIRST.BAT。这是一个微不足道的错误。更严重的是你的FIRST.BAT会在继续之前等待服务器退出(假设你添加了CALL)。但它应该在新窗口中启动并行服务器进程。最后,您对SECOND.BAT的后续调用不会与java服务器进行通信。你完全错过了OP的问题。 OP使用伪代码'echo stop>任务启动。bat'来表示他希望文本被定向为服务器进程的输入。 – dbenham

相关问题