如何使用批处理向进程写入命令

时间:2014-11-30 11:11:50

标签: batch-file command-line process console

假设我有一个正在等待输入的进程server.bat open。 我怎么能让另一个进程write.bat写入该server.bat进程?

例如,server.bat进程可以响应2个命令:save-on和save-off。 我想备份server.bat正在使用的文件,但是如果服务器处于保存模式,文件会被破坏,我想要做的是将save-off命令发送到进程,进行备份和然后编写save-on以重新启用保存。

我已经尝试停止该过程,备份并重新启动它,但这通常会导致更多的文件损坏,以及当前连接到服务器的人员带来的不便

- 编辑

我想在命令行中写一个字符串,在本例中是server.bat的一个实例。

一个简单的例子:

server.bat (无法更改)

@ECHO off
TITLE Server
:start
SET /P Command="Command: "
ECHO %Command%
GOTO :start

write.bat

@ECHO off
START server.bat
:Loop
TIMEOUT /t 5
:: So how do I target the instance of server.bat there?
ECHO "foo"> (...)?
GOTO :Loop

这两个文件都不是实际文件,只是为了澄清我的问题 您首先执行write.bat,而server.bat依次打开{{1}}并应该写入。

1 个答案:

答案 0 :(得分:0)

最好的方法是包含write.vbs文件:

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "More Specific Title X"
For I = 0 to WScript.Arguments.Count - 1
    WshShell.SendKeys WScript.Arguments(I) & " "
Next
WshShell.SendKeys "{ENTER}"

<强> write.bat

@ECHO off
START server.bat
:Loop
TIMEOUT /t 5
START write.vbs "foo"
GOTO :Loop

<强> server.bat

@ECHO off
TITLE More Specific Title X
:start
SET /P Command=
GOTO :start

警告:标题应与write.vbs中指定的字符串相同,并且应该是特定的,因为它表示进程的名称。

纯批处理的另一种方法是创建一个文本文件:

<强> server.bat

@ECHO off
:start
TIMEOUT /t 1
IF NOT EXIST %1 goto start
FOR /f "delims=" %%I IN (%1) DO ECHO %%I
DEL /q %1
GOTO :start

<强> write.bat

@ECHO off
SET ServerFile="%TMP%\WriteToServer"
DEL /q write.txt
START server.bat %ServerFile%
:Loop
TIMEOUT /t 5
ECHO "foo"> %ServerFile%
GOTO :Loop

第二种方式不会立即收到消息,但您可以使检查时间少于1秒。您可以在网上轻松找到类似于&#34; TIMEOUT&#34;的命令工具。但是以毫秒为单位。