【问题标题】:Batch (Windows) execute script wait for request and input the answer批处理(Windows)执行脚本等待请求并输入答案
【发布时间】:2013-05-12 19:33:06
【问题描述】:

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

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

ex output: 'do you want to proceed?'

waitForString("proceed?")
echo "yes"

问候, 散装

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

【问题讨论】:

  • 不,我认为这不是重复的,在您的示例中,您等待用户的输入,在我的示例中,您等待执行的脚本的输出。
  • 你的问题很模糊,请举一个更清楚的例子。
  • Batch => 执行 scriptA => 等待输出“你想继续吗?” => 给出答案“是”(没有用户做任何事情)
  • 您可以使用管道 - cmdA | cmdB - cmdA 的输出将输入到 cmdB - 或者这仍然不是您想要的?
  • 所以你想用等待脚本来模拟用户的回答?脚本应该如何“等待”:批处理没有多任务模式。

标签: windows scripting batch-file


【解决方案1】:

做不到?野狗的肾!

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

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

@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)

当两个附属 procs 都完成后,它会继续进行 - 好吧,在这种情况下是到 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 按预期显示两个子进程的结束时间。

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

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

【讨论】:

  • 是的,这是我的 Tee.bat 程序中使用的方法:使用文件作为信号来同步两个进程,正如我在回答中所说的那样! :)
  • 射击。我正要以同样的方式回答。有趣的是人们不认为这是一个多任务处理......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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 键以取消执行。这种行为“吃掉”另一个进程可能通过管道发送的字符。但是,可以通过另一个信号系统绕过此行为,因此管道的右侧在左侧有输出时立即读取输入。在this post 有一个批处理文件,它使用这种技术创建一个 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

    【讨论】:

      【解决方案4】:

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

      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“是”

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 1970-01-01
        • 2017-11-22
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多