当我的 Windows .bat 被调用时,ECHO 是打开还是关闭?

Den*_*owe 3 windows variables batch-file echo

当我从另一个CALLWindows.bat文件中读取一个文件时,被调用的文件是否可以判断是ECHO在调用者中ON还是OFF在调用者中?

.bat输入文件时,ECHO设置为ON(即使它OFF在 CALLER 中)。

我想将调用者保留ECHO status在被调用者中.bat,以便我可以从一个位置控制这两个调用(可能是两个以上嵌套调用的链)。

我可以传递参数或设置自己的环境变量,但有更好的方法吗?

编辑 只是为了澄清需要什么:callee.cmd 需要仅在运行期间使用 echo off 来执行操作。返回调用者后,它必须恢复调用者的回显状态。

请填写以下脚本中的 ?????? :

被调用者.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%
Run Code Online (Sandbox Code Playgroud)

来电者1.cmd:

@echo off
call callee.cmd
echo
Run Code Online (Sandbox Code Playgroud)

来电者2.cmd:

@echo on
call callee.cmd
echo
Run Code Online (Sandbox Code Playgroud)

所需输出:

caller1.cmd 必须打印echo off,caller2.cmd 必须打印echo on

可以在不创建磁盘上任何文件的情况下完成吗?

Ste*_*han 5

这是困难的一个。涉及管道或 a 的所有内容都for不起作用,因为会生成新进程,这会使echo状态无效。不过,可能涉及临时文件:

一只蝙蝠:

echo on
echo
call b.bat
echo off
echo
call b.bat
echo
Run Code Online (Sandbox Code Playgroud)

B、蝙蝠:

@(>tmp echo)
@type tmp|find "(ON)" >nul && (@set "oldEcho=ON") || (@set "OldEcho=OFF")
@echo off
echo B:echo was previously %OldEcho%
REM insert your payload here
REM restore previous Echo Status:
echo %OldEcho%
Run Code Online (Sandbox Code Playgroud)

结果:

C:\Folder>a

C:\Folder>echo on

C:\Folder>echo
ECHO ist eingeschaltet (ON).

C:\Folder>call b.bat
B:echo was previously ON

C:\Folder>echo off
ECHO ist ausgeschaltet (OFF).
B:echo was previously OFF
ECHO ist ausgeschaltet (OFF).
Run Code Online (Sandbox Code Playgroud)

这利用了(不直观的)事实,即开/关消息与语言相关(在上面的示例中是德语),但以英语后缀(ON)或结尾(OFF)(这在每种语言中应该是一致的;如果您知道一种不知道的语言)这样做,请告诉我们)

编辑(2023 年 11 月):我刚刚意识到(现在可以访问英文 Windows),echo英文的输出是ECHO is on./ ECHO is off.,使上述解决方案无效(find "(ON)".

我想替换findfindstr /i "\<ON\>"(搜索包括单词边界)应该可以解决这个问题,并且还可以避免误报(现在是因为/i)之类的事情ECHO eston deactivon (OFF)(如@jeb的评论)。

仍然不确定它是否是防弹的(适用于每种语言)。如果您偶然发现了一种导致失败的语言,请@通知我。