0

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

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

ex output: 'do you want to proceed?'

waitForString("proceed?")
echo "yes"

格列兹,布尔基

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

4

4 回答 4

3

做不到?野狗的肾!

如果可以使用批处理来创建我们所知道的宇宙,那么它不能做的事情并不多——如果你很灵活的话。

例如,这里有一个演示,它将对两个进程的输出进行批处理等待——它所需要的只是一点合作。

@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

这会发送两个进程,proc1并且proc2(我擅长创建富有想象力的任务名......)然后它会等到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 按预期显示两个辅助流程的结束时间。

只需将适当的输出字符串插入文件并使用标志文件通知控制批次子进程已完成工作。

当然,最初的问题有点模糊,我可能完全糊涂了……

于 2013-05-13T05:58:07.063 回答
1

您可以将字符或字符串通过管道传输或重定向到 bach 脚本,但脚本不可能等待问题(输入)并根据此给出答案。这属于 windows 命令行缺少的多任务处理方式。

于 2013-05-12T20:15:56.990 回答
0

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

scriptA.bat | output.bat

这样,当 output.bat 读取“你想继续吗?” 从它的标准输入,然后给 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 键以取消执行。这种行为“吃掉”另一个进程可能通过管道发送的字符。但是,可以通过另一个信号系统绕过此行为,因此管道的右侧在左侧有输出时立即读取输入。在这篇文章中,有一个批处理文件使用这种技术来创建一个 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

于 2013-05-13T03:46:34.937 回答
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

`我的批处理“是”

于 2013-05-12T22:54:55.823 回答