Скрыть логическую конструкцию в пакетном файле, но команды show фактически выполнены - PullRequest
3 голосов
/ 24 января 2012

У меня есть пакетный файл, в котором у меня есть блок IF / ELSE IF. Я не хочу, чтобы сам блок передавался пользователю, поскольку при этом выводится полный экран сложной логики, в котором трудно понять, что именно из него выполняется. Однако я бы хотел, чтобы команды, которые фактически выполняются внутри блока, передавались пользователю.

Помещение @ перед первым IF скрывает весь оператор, и, похоже, нет способа "показать" части. Попытка использовать @echo off и @echo on для отключения экранной отчетности для основного оператора и для логических ветвей, похоже, тоже не делает этого. Помощь

Ответы [ 2 ]

1 голос
/ 24 января 2012

Это не очень красиво, но работает:

@echo off
if 1==1 (
  echo on
  for %%a in (1) do echo command 1
  for %%a in (1) do echo command 2
)

Вы можете уменьшить количество набираемых текстов с помощью небольшого макроса.В этом примере также показано, как обрабатывать встроенную команду FOR.Символ @ перед () приводит к ECHO OFF для всех команд в предложении DO ().Без него будет отображаться как целое (...), так и каждая команда внутри.

@echo off
setlocal
set show=for %%a in (1) do
if 1==1 (
  echo on
  %show% echo command 1
  %show% echo command 2
  for /l %%n in (1 1 5) do @(
    %show% echo loop %%n A command IS shown
    echo loop %%n B command is NOT shown
  )
)
0 голосов
/ 24 января 2012

Вы можете перенаправить stdout в NUL на линиях, которые вы не хотите показывать.Вот несколько трюков, с которыми я играл:

SET var=yes
ECHO Before the block
@IF "%var%" == "yes" (
  ping 1.1.1.1 -n 1 -w 1 > NUL
  ping 1.1.1.1 -n 2 -w 1
)
PAUSE

Скрывает команды в блоке IF и отображает только выходные данные 2-го пинга.

SET var=yes
ECHO Before the block
@(IF "%var%" == "yes" (
  ping 1.1.1.1 -n 1 -w 1
  ping 1.1.1.1 -n 2 -w 1
)) > NUL
PAUSE

Willскрыть блок IF и не будет отображать выходные данные эхо-запросов.

SET var=yes
ECHO Before the block
(IF "%var%" == "yes" (
  ping 1.1.1.1 -n 1 -w 1
  ping 1.1.1.1 -n 2 -w 1
)) > NUL
PAUSE

Будет отображать выполняемые команды, но на экране не будет отображаться никакого вывода.

SET var=yes
ECHO Before the block
@IF "%var%" == "yes" (
  ping 1.1.1.1 -n 1 -w 1
  ping 1.1.1.1 -n 2 -w 1
)
PAUSE

Будетне показывать команды, но будет показывать вывод.

РЕДАКТИРОВАТЬ: Вот еще один

SETLOCAL ENABLEDELAYEDEXPANSION
SET var=yes
ECHO Before the block
IF "%var%" == "yes" (
  @ping 1.1.1.1 -n 1 -w 1 > NUL
  @ping 1.1.1.1 -n 2 -w 1 > NUL
)
PAUSE

Скрывает команду и вывод обоих пингов.

...