Windows 在批处理文件中隐藏逻辑构造,但显示实际执行的命令
我有一个批处理文件,其中有一个IF/ELSE IF块。我不希望块本身被“回响”给用户,因为这样做会打印出一个复杂逻辑的全屏,很难准确理解它执行的是什么。但是,我希望在块中实际执行的命令能够回传给用户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前面会隐藏整个语句,并且似乎没有办法“取消隐藏”部分。试图使用@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块本身。