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。
可以在不创建磁盘上任何文件的情况下完成吗?
这是困难的一个。涉及管道或 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)".
我想替换find为findstr /i "\<ON\>"(搜索包括单词边界)应该可以解决这个问题,并且还可以避免误报(现在是因为/i)之类的事情ECHO eston deactivon (OFF)(如@jeb的评论)。
仍然不确定它是否是防弹的(适用于每种语言)。如果您偶然发现了一种导致失败的语言,请@通知我。