| 的批处理文件功能

Batch file function of |

这个符号的作用是什么,“|”在批处理文件中执行 (shift + )? 为什么当我尝试 运行 以下代码时:

@echo off
echo ___________              __  .__                
echo \__    ___/___   _______/  |_|__| ____    ____  
echo   |    |_/ __ \ /  ___/\   __\  |/    \  / ___\  
echo   |    |\  ___/ \___ \  |  | |  |   |  \/ /_/  >
echo   |____| \___  >____  > |__| |__|___|  /\___  / 
echo              \/     \/               \//_____/   

或者干脆

echo |

程序刚启动然后立即退出,即使我输入

pause

最后


谢谢

这是一个 "pipe" 运算符。

例如

commandA | commandB

获取 commandA 的输出并将其 PIPES 作为 commandB 的输入。您必须转义管道字符以使其被视为明文字符,而不是管道:

echo ^|

管道“|”是嵌套两个命令。您得到第一个命令的输出,嵌套到第二个命令。

正如其他人所说,| 是管道运算符,它获取左侧任何命令的输出并将其作为输入传递给右侧的命令。如果要将字符视为文字,则必须将其转义为 ^| 或引用。但是您不想在输出中使用引号。

您还使用了需要转义的重定向运算符 >

您可能 运行 到其他需要转义或引用的字符(有时称为 "poison" 字符):

            escape
character  sequence

   ^          ^^
   |          ^|
   <          ^<
   >          ^>
   &          ^&
   %          %%

如果您使用非有效管道操作的未引号和未转义 | 编写命令脚本,则会生成致命语法错误,并且脚本会立即终止。

您的代码可以通过转义所有 "poison" 个字符来修复。但是添加 ^ 转义字符会使源代码几乎不可读:

@echo off
echo ___________              __  .__                 
echo \__    ___/___   _______/  ^|_^|__^| ____    ____   
echo   ^|    ^|_/ __ \ /  ___/\   __\  ^|/    \  / ___\  
echo   ^|    ^|\  ___/ \___ \  ^|  ^| ^|  ^|   ^|  \/ /_/  ^> 
echo   ^|____^| \___  ^>____  ^> ^|__^| ^|__^|___^|  /\___  /  
echo              \/     \/               \//_____/   

有一些编码技术可以让您在源代码中保留原始外观,并仍然获得所需的输出。

1) 带引号的简单 FOR

限制:输出不能包含 "*?

for %%A in (
" ___________              __  .__                 "
" \__    ___/___   _______/  |_|__| ____    ____   "
"   |    |_/ __ \ /  ___/\   __\  |/    \  / ___\  "
"   |    |\  ___/ \___ \  |  | |  |   |  \/ /_/  > "
"   |____| \___  >____  > |__| |__|___|  /\___  /  "
"              \/     \/               \//_____/   "
) do echo %%~A

%%~A 中的 ~ 修饰符删除了引号

2) 带标签的文本结合 FOR /F 和 FINDSTR

限制:输出行不能以:

开头
@echo off

::: ___________              __  .__                
::: \__    ___/___   _______/  |_|__| ____    ____  
:::   |    |_/ __ \ /  ___/\   __\  |/    \  / ___\ 
:::   |    |\  ___/ \___ \  |  | |  |   |  \/ /_/  >
:::   |____| \___  >____  > |__| |__|___|  /\___  / 
:::              \/     \/               \//_____/  

for /f "delims=: tokens=*" %%A in ('findstr "^:::" "%~f0"') do @echo(%%A

我选择:::作为消息标签,因为::经常被用作评论。

上面的效果很好,但是如果要指定多条消息就不方便了。这可以通过对标签更有创意来轻松解决。一个:print子程序也很方便

@echo off

::Testing: ___________              __  .__                
::Testing: \__    ___/___   _______/  |_|__| ____    ____  
::Testing:   |    |_/ __ \ /  ___/\   __\  |/    \  / ___\ 
::Testing:   |    |\  ___/ \___ \  |  | |  |   |  \/ /_/  >
::Testing:   |____| \___  >____  > |__| |__|___|  /\___  / 
::Testing:              \/     \/               \//_____/  
::Testing:

::Test: ___________              __  
::Test: \__    ___/___   _______/  |_
::Test:   |    |_/ __ \ /  ___/\   __\
::Test:   |    |\  ___/ \___ \  |  |
::Test:   |____| \___  >____  > |__|
::Test:              \/     \/      
::Test:

call :print Testing
call :print Test
exit /b    

:print  label
for /f "delims=: tokens=1*" %%A in ('findstr "^::%~1:" "%~f0"') do echo(%%B
exit /b

要获得更大的灵活性 - 查看 How would I use some multi line ascii art as my characters for a counter? (batch)

特别是,my answer and Aacini's answer 两者都为您提供了使用您选择的横幅字体打印几乎任何字符串的选项。