Lần thử đầu tiên của tôi là thất bại hoàn toàn - cảm ơn vì đã chỉ ra lỗi. Đối với những người quan tâm, câu trả lời gốc có sẵn trong lịch sử chỉnh sửa.
Aacini có giải pháp tốt nếu bạn không ngại đưa chương trình con của mình vào một tệp riêng biệt.
Dưới đây là giải pháp hoạt động mà không cần tệp đợt 2. Và nó thực sự hoạt động lần này! :)
(Chỉnh sửa 2 - tối ưu hóa mã theo đề nghị của Jeb trong comment)
: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
)
Nếu bạn sẵn sàng đưa lên với nguy cơ nhẹ của hai quá trình đồng thời cố gắng truy cập cùng một tập tin, các: getEchoState thường có thể được đơn giản hóa mà không cần SETLOCAL hoặc biến tạm thời.
: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
)
Ý tưởng hay nhưng không thể hoạt động! Khi 'echo' trong' for/f 'tokens = 3 delims =. "%% A in (' echo ')' sẽ được thực hiện trong một ngữ cảnh cmd mới và luôn luôn là 'ON'. Vấn đề thứ hai là ngay cả khi bạn nhận được trạng thái nó đã được bản địa hóa, như trên hệ thống của tôi, tôi có 'ECHO ist eingeschaltet (ON). ' – jeb
Tất nhiên bạn đúng, chết tiệt :) Phần tồi tệ nhất là, tôi đã khám phá tất cả của điều này một thời gian dài trước đây (ngoại trừ vấn đề của Đức), và quên! Tôi sẽ đưa ra một phiên bản làm việc. – dbenham
Bạn có thể sử dụng chuyển hướng 'echo> tmpfile.tmp' và sau đó sử dụng vòng lặp FOR. Có lẽ mã thông báo cuối cùng luôn là ON/OFF hoặc (ON)/(OFF) – jeb