我有一个批处理文件,其中有一个IF/ELSE IF块。我不希望代码块本身被“回显”给用户,因为这样做会打印出一整屏复杂的逻辑,很难确切地理解其中执行了什么。但是,我希望将在块中实际执行的命令回显给用户。
将@放在第一个IF前面会隐藏整个语句,而且似乎没有办法“取消隐藏”部分。尝试使用@echo off和@echo on来关闭主语句的屏幕报告和打开逻辑分支的屏幕报告,似乎也做不到这一点。帮助?
发布于 2012-01-24 09:57:30
它不是很漂亮,但它很有效:
@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。没有它,整个(...)将与其中的每个命令一样被回显。
@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
)
)发布于 2012-01-25 00:12:52
您可以在您不想显示的行上重定向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的命令和输出。
https://stackoverflow.com/questions/8980998
复制相似问题