|的批处理文件功能

Kry*_*lri 0 batch-file

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

@echo off
echo ___________              __  .__                
echo \__    ___/___   _______/  |_|__| ____    ____  
echo   |    |_/ __ \ /  ___/\   __\  |/    \  / ___\  
echo   |    |\  ___/ \___ \  |  | |  |   |  \/ /_/  >
echo   |____| \___  >____  > |__| |__|___|  /\___  / 
echo              \/     \/               \//_____/   
Run Code Online (Sandbox Code Playgroud)

或者干脆

echo |
Run Code Online (Sandbox Code Playgroud)

程序刚刚启动,即使我放了也会立即退出

pause
Run Code Online (Sandbox Code Playgroud)

在末尾


谢谢

dbe*_*ham 5

正如其他人所说的那样,|管道操作员接受左边任何命令的输出并将其作为输入传递给右边的命令.如果要将字符视为文字,则必须将其转义为^|或引用.但是你不需要输出中的引号.

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

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

            escape
character  sequence

   ^          ^^
   |          ^|
   <          ^<
   >          ^>
   &          ^&
   %          %%
Run Code Online (Sandbox Code Playgroud)

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

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

@echo off
echo ___________              __  .__                 
echo \__    ___/___   _______/  ^|_^|__^| ____    ____   
echo   ^|    ^|_/ __ \ /  ___/\   __\  ^|/    \  / ___\  
echo   ^|    ^|\  ___/ \___ \  ^|  ^| ^|  ^|   ^|  \/ /_/  ^> 
echo   ^|____^| \___  ^>____  ^> ^|__^| ^|__^|___^|  /\___  /  
echo              \/     \/               \//_____/   
Run Code Online (Sandbox Code Playgroud)

有一些编码技术允许您保留源代码中的原始外观,并仍然获得所需的输出.

1)带引号的简单FOR

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

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

将~在修改%%~A删除封闭报价

2)带有FINDSTR的FOR/F标记文本

限制:没有输出行可以开始 :

@echo off

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

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

我选择:::作为消息标签,因为::它经常用作注释.

上述方法效果很好,但如果要指定多条消息则不方便.这可以通过标签更具创造性来轻松解决.一个: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
Run Code Online (Sandbox Code Playgroud)

为了更加灵活 - 请查看我如何使用一些多行ascii艺术作为计数器的字符?(批).

特别是,我的答案和Aacini的答案都为您提供了使用您选择的横幅字体打印几乎任何字符串的选项.