Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在批处理文件中隐藏逻辑构造,但显示实际执行的命令_Windows_Command Line_Batch File - Fatal编程技术网

Windows 在批处理文件中隐藏逻辑构造,但显示实际执行的命令

Windows 在批处理文件中隐藏逻辑构造,但显示实际执行的命令,windows,command-line,batch-file,Windows,Command Line,Batch File,我有一个批处理文件,其中有一个IF/ELSE IF块。我不希望块本身被“回响”给用户,因为这样做会打印出一个复杂逻辑的全屏,很难准确理解它执行的是什么。但是,我希望在块中实际执行的命令能够回传给用户 将@放在第一个IF前面会隐藏整个语句,并且似乎没有办法“取消隐藏”部分。试图使用@echo off和@echo on来关闭主语句的屏幕报告,打开逻辑分支的屏幕报告,似乎也无法做到这一点。帮助?它不是很漂亮,但它可以工作: @echo off if 1==1 ( echo on for %%a

我有一个批处理文件,其中有一个IF/ELSE IF块。我不希望块本身被“回响”给用户,因为这样做会打印出一个复杂逻辑的全屏,很难准确理解它执行的是什么。但是,我希望在块中实际执行的命令能够回传给用户


将@放在第一个IF前面会隐藏整个语句,并且似乎没有办法“取消隐藏”部分。试图使用@echo off和@echo on来关闭主语句的屏幕报告,打开逻辑分支的屏幕报告,似乎也无法做到这一点。帮助?

它不是很漂亮,但它可以工作:

@echo off
if 1==1 (
  echo on
  for %%a in (1) do echo command 1
  for %%a in (1) do echo command 2
)
您可以用一点宏来减少键入的数量。此示例还显示了如何处理嵌入式FOR命令。()前面的@有效地作为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
  )
)

您可以在不想显示的行上将
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块中的命令,并仅显示第二次ping的输出

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
将隐藏IF块,并且不会显示ping的输出

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

隐藏两个ping的命令和输出。

最简单的解决方法是转到。如果使用得当,它相当于结构化if block.GOTO对于for DO子句不起作用,但是CALL会起作用。它不在原始问题中,但有类似的问题。因此,嵌套FOR的主体似乎不受最后一个开口括号之前的
@
的影响,是吗?好把戏,我不知道@AndriyM-Yes-如果ECHO处于启用状态,则DO子句中的每个命令都将显示,除非该命令的前缀为@,或者整个子句包含在前缀为@的parens中。这并不能解决问题。OP希望显示在IF块体中执行的命令,但不显示IF块本身。