Rumata пишет:Буржуи тоже интересуются вопросом и решают
Следует признать, что решение практически идентичное:
: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
)
--------------------
OFF: Мысль использовать перенаправление вывода FOR...REM мне пришла ранее при решении другой задачи:
wisgest пишет:получить в общем случае параметры командного файла (в переменную среды, для возможности использования с отложенной подстановкой) без потерь и инъекций кода.
В общих чертах (без подбора допустимого имени временного файла и блокирования от посторонних процессов до его прочтения) решение выглядело так:
prompt .
echo on
@(for %%i in (.) do rem %*
)>args.tmp
@echo off
(set /p=& set /p args=)<args.tmp
set args=!args:~5,-1!
wisgest пишет:Пожалуй, для этого вопроса лучше создать отдельную тему в разделе отведённом командным файлам.
Тему так и не создал, т.к. в решении разочаровался (хотя, да, с инъекцией кода вопрос решился) по следующим причинам:
1) CMD /U — файл создаётся в юникоде, но SET /P всё-равно читает его как в однобайтной кодировке;
2) CMD /A (как обычно) — в действительности, командная строка может содержать символы в юникоде. Хотя при использовании шрифта Terminal при выводе на экран они заменяются похожими (напр., многоточие на двоеточие), но при внутренней обработке (присваивании параметров командного файла переменным среды, передаче в качестве параметров другим приложениям) они сохраняются. Но при перенаправлении вывода в файл они искажаются;
3) ну и, наконец, CMD /Q.
(Кстати, отсутствие полноценного решения этой задачи я считаю основным и существенным недостатком командных файлов.)