我的第一次嘗試是徹底的失敗 - 謝謝jeb指出錯誤。對於那些感興趣的人,原始答案在編輯歷史中可用。
如果您不介意將子程序放在單獨的文件中,Aacini有一個很好的解決方案。
這是一個解決方案,不需要第二個批處理文件。而且這次真的有用! :)
(編輯2 - 每傑布在評論建議優化代碼)
: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
)
如果你願意忍受的兩個進程同時試圖訪問同一文件的風險很小,在: getEchoState例程可以簡化而不需要SETLOCAL或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
)
不錯的想法,但它不能工作!由於'for/f「標記中的'echo'= 3 delims =。」%% A('echo')中的A將在新的cmd-context中執行並始終爲'ON'。第二個問題是,即使你得到的狀態是本地化的,就像我的系統一樣,我得到了'ECHO ist eingeschaltet(ON)'。' – jeb 2012-03-07 08:09:20
當然你是對的,該死的:)最糟糕的是,我已經發現了所有這很久以前(德國問題除外),並忘記了!我會想出一個工作版本。 – dbenham 2012-03-07 12:38:18
您可以使用重定向'echo> tmpfile.tmp',然後使用FOR循環。也許最後一個標記總是ON/OFF或(ON)/(OFF) – jeb 2012-03-07 12:43:27