Mi primer intento fue una falla total - gracias jeb por señalar los errores. Para aquellos que están interesados, la respuesta original está disponible en el historial de edición.
Aacini tiene una buena solución si no le importa poner su subrutina en un archivo separado.
Aquí hay una solución que funciona sin necesidad de un segundo archivo por lotes. ¡Y realmente funciona esta vez! :)
(Edición 2 - código optimizado según la sugerencia de Jeb en el comentario)
:mysub
::Silently get the echo state and turn echo off
@(
setlocal
call :getEchoState echoState
echo off
)
::Do whatever
set return=returnValue
::Restore the echo state, pass the return value across endlocal, and return
(
endlocal
echo %echoState%
set return=%return%
exit /b
)
:getEchoState echoStateVar
@setlocal
@set file=%time%
@set file="%temp%\getEchoState%file::=_%_%random%.tmp"
@(
for %%A in (dummy) do rem
) >%file%
@for %%A in (%file%) do @(
endlocal
if %%~zA equ 0 (set %~1=OFF) else set %~1=ON
del %file%
exit /b
)
Si usted está dispuesto a soportar el riesgo leve de dos procesos al mismo tiempo tratando de acceder al mismo archivo, el: La rutina getEchoState se puede simplificar sin la necesidad de SETLOCAL o una variable temp.
:getEchoState echoStateVar
@(
for %%A in (dummy) do rem
) >"%temp%\getEchoState.tmp"
@for %%A in ("%temp%\getEchoState.tmp") do @(
if %%~zA equ 0 (set %~1=OFF) else set %~1=ON
del "%temp%\getEchoState.tmp"
exit /b
)
¡Buena idea, pero no puede funcionar! Como el 'echo' en' for/f "tokens = 3 delims =." %% A in ('echo') 'se ejecutará en un nuevo contexto cmd y siempre estará 'ON'. El segundo problema es que incluso si obtienes el estado está localizado, como en mi sistema obtuve 'ECHO ist eingeschaltet (ON) .' – jeb
Por supuesto que estás en lo correcto, maldita sea :) La peor parte es que ya había descubierto todo de esto hace mucho tiempo (a excepción del problema alemán), ¡y se olvidó! Voy a venir con una versión de trabajo. – dbenham
Puede usar la redirección 'echo> tmpfile.tmp' y luego usar un FOR-loop. Quizás el último token esté siempre ON/OFF o (ON)/(OFF) – jeb