将cmd批处理文件中的回显重定向到变量失败

将cmd批处理文件中的回显重定向到变量失败

我使用下面的函数来检查回显是打开还是关闭,正如您所看到的,它通过管道传输回显状态,然后使用输出来设置标志:

功能

: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.

所以我想这个问题还没有解决。我仍然有一个不太优雅的解决方案,所以这也不是那么糟糕!如果其他人有什么想法,我会非常乐意去探索它们 :-)

相关内容