微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批量Windows执行脚本等请求并input答案

问题:我想创build一个执行其他脚本的batch file。 那么唯一的问题是,你不能通过参数给出必要的input。 脚本要求一些数据。 有没有什么办法来等待一个特定types的string和基于这个string的答案?

有点像VCR在secureCRT:crt.screen.WaitForString(“问题”)

ex output: 'do you want to proceed?' waitForString("proceed?") echo "yes"

Greetz,Bulki

编辑:这不同于通过控制台询问用户的input。 批次必须自动给出由te启动的脚本生成输出

检查时间戳是否在一定范围内使用bash脚本

当我启动我的ubuntu机器时,自动启动rails服务器

计数器不会在Windowsbatch file中用FOR循环中的IF语句递增

运行一个从stdin(Linux / Shell脚本)

Linux脚本:传递参数

从命令行计算文件的校验和

易于使用的AutoHotkey / AutoIT的替代品的Linux

Linux命令 – 超时中止操作

通过Powershell查找Windows中的上次login时间

我可以启动一个脚本,使其独立于Linux上的父进程吗?

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

不能做? 丁戈的肾脏!

如果批量可以被用来创建我们所知道的宇宙,那么它就不会有太多的事情做不到 – 如果你是灵活的。

例如,下面是一个演示,它将在两个进程的输出上进行批量等待 – 所需的只是一点点的合作。

@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按预期显示两个子过程的结束时间。

所需要的就是将适当的输出字符串戳到一个文件中,并使用标志文件通知控制批次子进程已完成其工作。

当然,原来的问题是朦胧的,我可能已经完全糊涂了…

让我们分析一下你的请求。 据我所知,你需要类似这样的东西:

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中回答“yes”! 当然,从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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐