批处理(Windows)执行脚本等待请求并输入答案

时间:2013-05-12 19:33:07

标签: windows scripting batch-file

问题: 我想创建一个执行其他脚本的批处理文件。那么唯一的问题是,你不能通过参数给出必要的输入。脚本会在此过程中询问一些数据。有没有办法等待特定类型的字符串并根据此字符串回答?

有点像secureCRT中的VBS:crt.screen.WaitForString(“question”)

ex output: 'do you want to proceed?'

waitForString("proceed?")
echo "yes"

格尔茨, Bulki

编辑:这与通过控制台询问用户的输入不同。批处理必须自动给出te启动脚本生成的输出答案。

4 个答案:

答案 0 :(得分:3)

无法完成? Dingo的肾脏!

如果批量可以用来创建我们所知道的宇宙,那么它是不可能做到的 - 如果你是灵活的。

例如,这是一个演示,它将对两个进程的输出进行批量等待 - 它只需要一点合作。

@ECHO OFF
SETLOCAL
FOR %%i IN (1 2) DO DEL proc%%i.finished 2>nul&SET proc%%i=&START proc%%i
:loop
FOR %%i IN (1 2) DO IF EXIST proc%%i.finished CALL :getdata %%i
FOR %%i IN (1 2) DO IF NOT DEFINED proc%%i timeout /t 1 >NUL &GOTO loop
SET proc
GOTO :eof

:getdata
DEL proc%1.finished
FOR /f "delims=" %%o IN (proc%1.output) DO SET proc%1=%%o
DEL proc%1.output
GOTO :eof

这会发送两个进程,proc1proc2(我擅长创建富有想象力的任务名...)然后等待,直到创建文件procN.finished并处理相应的procN.output(只是将输出行放入envvar PROCn

当两个附属过程完成时,它会继续 - 好吧,在这种情况下为EOF ......

以下是我用于测试的辅助程序的示例:

@echo off
setlocal enabledelayedexpansion
set /a delay=2+(%random% %% 3)
timeout /t %delay%
>proc2.output ECHO Finished AT %DATE% %TIME%
ECHO.>proc2.finished
EXIT

proc1.bat是一样的,有一些数字改变了。

正常工作 - SET按预期显示两个子流程的结束时间。

只需将相应的输出字符串戳入文件并使用标记文件通知控制批处理子程序已完成其工作。

当然,最初的问题是愚蠢的,我可能完全混淆了......

答案 1 :(得分:1)

您可以将字符或字符串管道或重定向到bach脚本,但脚本无法等待问题(输入)并根据此情况给出答案。这属于Windows命令行中缺少的多任务模式。

答案 2 :(得分:0)

您需要更改第二组批处理文件,以便输入问题被清除,然后在运行其余批处理文件的批处理文件中提供环境变量所需的数据。

EG:在需要输入的每个批处理文件中更改此项:

set /p "answerone=input your data: "

到这个

REM set /p "answerone=input your data: "

在调用批处理文件中,您将添加包含环境变量和数据的行,以替换辅助批处理文件中的数据:

set "answerone=%~1"
"call mybatch1.bat"
rem repeat for more input on other batch files

并启动这样的第一个批处理文件,以便变量传播到被调用的批处理文件 - %answerone%将设置为yes

`mybatch“是”

答案 3 :(得分:0)

让我们稍微分析一下你的要求。据我了解,你想要类似的东西:

scriptA.bat | output.bat

这样,当output.bat读为“你想继续吗?”从它的STDIN,然后给scriptA.bat一个“是”的答案,对吗?但是,output.bat无法为scriptA.bat提供任何输入!为此,您必须组装类似于此的内容:

input.bat | scriptA.bat | output.bat

在这种情况下,当output.bat检测到“你想继续吗?”时,它必须向input.bat发送某种类型的信号,所以它在scriptA.bat的STDIN中回答“是”!当然,从output.bat发送到input.bat的信号不能通过普通数据流传输,它必须是其他类型的:例如,存在磁盘文件。虽然以前的方案理论上应该有效,但这里还有另一个问题。

当批处理文件执行时,它会不断轮询键盘以检测可能的Ctrl-C键以取消执行。此行为“吃掉”另一个进程可能通过管道发送的字符。但是,可以通过另一个信号系统绕过此行为,因此管道的右侧在左侧输出后立即读取输入。在this post,有一个Batch文件使用这种技术创建一个Tee.bat程序,该程序在屏幕和磁盘文件中复制其管道输入。

继续我们的主题,无法通过批处理文件解决您的问题。但是,在JScript中执行此操作相对容易,例如:

var WshShell = new ActiveXObject("WScript.Shell");
var oExec = WshShell.Exec("scriptA.bat");
var line = oExec.StdOut.ReadLine();
if (line == "do you want to proceed?") oExec.StdIn.WriteLine("yes");

http://msdn.microsoft.com/en-us/library/ateytk4a(v=vs.84).aspx