当我从一个Windows .bat
文件CALL
另一个Windows .bat
文件时,被调用的文件是否可以告诉ECHO
在调用者中是ON
还是OFF
?
当输入.bat
文件时,ECHO
被设置为ON
(即使在CALLER中它是OFF
)。
我想在被调用的.bat
中保留调用方的ECHO
status
,这样我就可以从一个地方控制两者(可能是两个以上嵌套调用的链)。
我可以传递一个参数或者设置我自己的环境变量,但是有没有更好的方法?
编辑只是为了说明需要什么:cmd只需要在运行期间关闭回显。2在返回到调用者时,它必须恢复调用者的回显状态。
请填写以下脚本中的?????s:
callee.cmd:
@rem save the echo state
@ ???? HOW???? ????
@ set "savedEchoState=??????"
@rem the following commands must not be echoed
@echo off
command1
command2
command3
@rem restore the previous echo state
echo %savedEchoState%
caller1.cmd:
@echo off
call callee.cmd
echo
caller2.cmd:
@echo on
call callee.cmd
echo
所需输出:
caller1.cmd必须打印echo off
,而caller2.cmd必须打印echo on
。
不需要在磁盘上创建任何文件就能完成吗?
4条答案
按热度按时间laximzn51#
这是一个困难的问题。所有涉及管道或
for
的操作都不起作用,因为会生成新的进程,从而使echo
状态无效。可能涉及临时文件:A.BAT:
B.BAT:
结果:
xeufq47z2#
要检测ECHO状态而不依赖于Windows语言,您可以使用临时文件。
当ECHO为OFF时,该文件为空,否则它包含
ECHO IS ON
的语言字符串。Win10的解决方案,不需要建立档案(需要vt100)
这将使用ansi转义序列将光标移动到第1行。
当 *echo关闭 * 时,光标不会改变,否则会移到下一行。
然后,程式码会读取游标的行号,并还原原始的游标位置。
状态仅取决于检索到的行号。
2ul0zpep3#
我也遇到了同样的问题,最后出现在这个页面上。
下面是jeb脚本的一个稍微改进的版本。
如果您接受只测试errorlevel,则可以使检测例程更短:
gg58donl4#
(编辑Stephan的答案,考虑到回声状态也可以用小写报告,并且他的答案不允许编辑。)
下面的前两行和最后一行保存和恢复回显状态。第3行到第6行应该替换为您的代码: