Включить эхо для одной команды в командном файле - PullRequest
2 голосов
/ 06 ноября 2019

В пакетном файле Windows, если бы у меня было включено эхо (по умолчанию), я мог бы отключить эхо отдельной команды, добавив префикс @, например:

some_command_that_will_be_echoed
@some_command_that_wont_be_echoed

Однако эхо у меня отключенос @echo off, но время от времени я хотел бы повторить команду. Есть ли магический эквивалент? Например:

@echo off
some_command_that_wont_be_echoed
<unknown_magic_prefix> some_command_that_will_be_echoed

Я нашел этот вопрос: временно включить эхо , но это по сути говорит: «Включите эхо, сделайте свое дело, затем выключите его снова». Я мог бы сделать это, но я надеюсь на что-то более элегантное.

РЕДАКТИРОВАТЬ: этот командный файл Windows: как включить встроенное эхо команды в списке опубликованных вопросов;это в основном тот же вопрос, что и мой, и примерно такой же успешный!

EDIT2: в интересах обеспечения контекста ниже приведен раздел того, чем я занимаюсь. Обратите внимание, что я украсил его комментариями в стиле C в пользу этого поста;они не в реальном сценарии.

@echo off   // Because I don't want the bulk of the commands displayed. 
            // (In fact it's worse than that, this file is called from another
            //  with echo already disabled.)

title CMD Window with SVN enabled

set PATH=  ...  // my new path which happens to include SVN this time

svn --version --quiet   // This command outputs just the SVN version as a number
                        // but it gets rather lost on its own, and the 'full'
                        // output is too wordy.  My belief is that if the entire
                        // command was echoed, it would provide a perfect 
                        // context.

echo SVN version is:    // This is an obvious alternative, simply putting a
svn --version --quiet   // message before the actual command.

echo svn --version --quiet  // Or even just echoing the command 'by hand'
svn --version --quiet

+@svn --version --quiet   // This imaginary syntax would be the gold-standard

always_echo( svn --version --quiet )   // This function would be acceptable, but
                                       // its definition eludes me and seems 
                                       // clunky

<some batch file magic preamble>    // This would be okay, but would get arduous
svn --version --quiet               // if it was long-winded or had to be done a
<some batch file magic to close>    // few times or more.

Но только для того, чтобы подчеркнуть, хотя это конкретный пример, который было бы относительно легко «исправить», я ищу более общее решение, которое я мог быиспользуйте в других ситуациях, которые могут быть не такими простыми.

@ Compo обоснованно указал, что @echo off не очень элегантно само по себе. Это справедливо, но а) это уже включено в этом случае и б) это довольно идиоматично. Мне нравится ясность этого (воображаемого синтаксиса):

@echo off
command_1    // not echoed
command_2    // not echoed
+@command_3  // IS echoed and stands out
command_4    // not echoed

против

@command_1    // not echoed
@command_2    // not echoed
command_3     // IS echoed and gets a little lost
@command_4    // not echoed

Очевидно, что это субъективное мнение, но сводится к желанию украсить только необычный случай.

И, наконец, если это действительно невозможно, то достаточно справедливо, но нет никакого вреда в том, чтобы быть уверенным :)

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Вы можете использовать небольшой макрос (%+@%), он покажет команду и затем выполнит ее.

@echo off    
call :define_macro

setlocal EnableDelayedExpansion
set var=content

%+@% ver
%+@% ver /?
%+@% echo %var% !var!
exit /b

:define_macro
(set \n=^^^

)
set ^"+@=for %%# in (1 2) do if %%#==2 (%\n%
    setlocal EnableDelayedExpansion %\n%
    for /F "tokens=1,*" %%1 in ("!time: =0! !argv!") do (%\n%
        endlocal%\n%
        echo %%1 Execute: %%2%\n%
        endlocal%\n%
        %%2%\n%
      )%\n%
    ) ELSE setlocal DisableDelayedExpansion ^& set argv="

exit /b

Выходы:

14: 04: 08, 05 Выполнить: версия

Microsoft Windows [Версия 10.0.17134.1069]
14: 04: 08,05 Выполнить: версия /?
Отображение версии Windows.

VER
14: 04: 08,05 Выполнить: echo content! Var!
content content

Отредактировано: из предложений sst я удалил помощникафункции, но чтобы иметь возможность использовать собственный и красивый префикс, я решил не использовать echo on внутри макроса.

1 голос
/ 06 ноября 2019

Вот пример, который может вам помочь:

@(
    Echo On
    Title CMD Window with SVN enabled
    Set "PATH=%PATH%;D:\ummy\directory"
)
svn --version --quiet
@(
    Rem All other none echoed commands here
    Pause
    Echo Off
    Exit /B
)
...