|的批处理文件功能

时间:2015-01-14 16:30:28

标签: batch-file

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

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

或只是

echo |

程序刚刚启动,即使我放

也会立即退出
pause

最后


由于

3 个答案:

答案 0 :(得分:5)

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

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

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

            escape
character  sequence

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

如果使用不带引号和非转义的|编写一个不是有效管道操作的命令,那么它会生成致命的语法错误,并且脚本会立即终止。

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

@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 answerAacini's answer都为您提供了使用您选择的横幅字体打印几乎所有字符串的选项。

答案 1 :(得分:4)

它是一个&#34;管道&#34;运营商。

e.g。

commandA | commandB

commandA和PIPES的输出作为commandB的输入。您必须转义管道字符才能将其视为明文字符,而不是管道:

echo ^|

答案 2 :(得分:0)

管道&#34; |&#34;是嵌套两个命令。你得到第一个命令的输出,而nest是第二个命令。