我使用下面的函数来检查回显是打开还是关闭,正如您所看到的,它通过管道传输回显状态,然后使用输出来设置标志:
功能
:echos
echo > echo.txt & rem pipe ech status to a text file
@echo off
set _echos=yes
:: default assumption is that echo was on
CALL FileStringLength echo.txt & rem fetch string length. eq to 12 if off
IF %_strlength% EQU 12 (set _echos=no)
del echo.txt & rem zap temporary file
set "_strlength=" & rem zap temporary variable
set "_echos" & rem show status
IF %_echos% EQU yes (@echo on
) ELSE (
@echo off
)
:: /echos
它工作正常,但创建文件感觉……不雅观。所以我想,嗯,为什么不直接做重定向呢?用以下方法替换管道:
>echo|set /p _str="redirect"
结果如下所示,当我检查字符串变量时,它不存在:
redirect
>set _str
Environment variable _str not defined
>
不是我想要的。在某个时候,在凌晨思绪飘忽的时候,我得到了结果!哇哦!在沙发上漂亮地崩溃了……但我无论如何也想不起来是什么神秘的代码组合让重定向起作用了!叹 有谁解决过这个特殊问题吗?或者这只是凌晨时分强迫症引起的幻觉?
答案1
测试 Echo 状态并将状态赋给变量的函数。遗憾的是仍然无法避免临时文件
@ECHO OFF
:getstate
CALL :ECHO_STATE
ECHO Echo is %state%
DEL /Q "tempEstate.sav"
PAUSE
GOTO :EOF
:ECHO_STATE
ECHO>tempEstate.sav && FIND /I "OFF" "tempEstate.sav" >nul || Set "state=on" && GOTO :EOF
Set "state=off"
GOTO :EOF
答案2
遗憾的是,@DavidPostill 链接中建议的解决方案在我的用例中失败了。
for /f "delims=" %%a in ('echo 111') do set "readValue=%%a"
然而,当批量运行该解决方案时(以捕获回显的状态):
@echo off
echo: pre for-do
echo
for /f "delims=" %%a in ('echo') do set "_str=%%a"
echo: post for-do
echo
echo _str= %_str%
输出为:
pre for-do
ECHO is off.
post for-do
ECHO is off.
_str= ECHO is on.
所以我想这个问题还没有解决。我仍然有一个不太优雅的解决方案,所以这也不是那么糟糕!如果其他人有什么想法,我会非常乐意去探索它们 :-)