我假设你的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,因为它是更直截了当。
http://superuser.com/questions/764392/sending-input-to-command-line-program-from-text-batch-file此问题的第一个答案建议“VBScript.SendKeys” – lessthanideal
您是否尝试过使用[参数](http://ss64.com/nt/syntax-args.html)? –