CMD BATCH pipe / redirect / EOF signal V1.3
管道Pipe
A | B,同时(异步)开始A、B,设置B的输入流(0)为A的输出流(1)。
在A执行结束/返回/退出后,A的输出传递作为B的输入,执行B。"在A结束后",而非实时。
-
关于顺序的测试:
>(ping 192.168.0.0 >nul & echo 1 >>&2) | echo 2 >>&2 2 ;回车以上命令后立即输出 1 ;等待ping命令超时后,得到此输出 -
A|B中,A、B为新环境,其中A独立,B继承上文,即:>set var=a var=a >set var >&2 | echo >nul 环境变量 var 没有定义 ;独立新环境 >echo %var% >&2 | echo >nul ;在解析时,展开为'echo a >&2 | echo >nul' a >echo >nul | set var var=a ;继承上文环境 >echo >nul | set var >&2 ;同上 var=a >echo >nul | (set var) ;同上 var=a >echo >nul | (<&3 set var) ;在管道中,在括号内设置输入输出流改变环境,且不继承 环境变量 var 没有定义 >(<&3 set var) ;在非管道中,括号无影响 var=a > >echo >nul | set var=b ;设置了新环境中的var >set var var=a ;以上'set var=b'不影响上文环境 > ;或者 >echo >nul | (set var=b & set var) var=b ;设置了新环境中的var >set var var=a ;不影响上文环境 > ;或者 >echo c | (set /P var= & set var) var=c ;设置新环境中的var >set var var=a ;不影响上文环境 -
或者,单行:
>set var=a & set var & set var >&2 | echo b | (set /p var= & set var) >&2 & set var >&2 var=a 环境变量 var 没有定义 var=b var=a在管道中使用了2号流,为保持按顺序输出,后续流也改为2#。
其中(set /p var= & set var) >&2,>&2得在括号外。
重定向Redirect
A > B、C < D,是执行前的赋值操作,传递关于输入、输出流之环境(广义的参数)。
-
"执行前的赋值":类似于(狭义的)传递参数,不过位置宽松,形式不同于
Command Arg Arg2 ..。 -
"环境":类似upvalue。
-
赋值顺序:
从前往后,后面的会覆盖前面的。
可以在前面放置默认值,不影响后半部分覆盖。
如
3>>%default% 1>>&3,设置流1默认为default。3作为中间/临时/中转流,初始为空。- 不可直接
1>>%default%,否则,若default==&1,则相当于1>&1,会报错"重定向句柄 1 时,无法复制此句柄。"
流Stream
-
来自设备、(广义)文件的数据流。描述:
-
系统默认,使用流编号:
命令使用流
如findstr(、find)等命令会等待静态值参数满足后执行。
"等待静态值":即,不可一边输入,一边处理。具体如:
- 当使用管道时,不存在问题,立即执行。
- 当使用重定向时,
结束输入流
-
命令行(CMD)终端设备下,
-
按键Ctrl+Z,生成[EOF](End of File) [SUB],ASCII '\026'。作为内容,显示为
^Z。 -
按键Ctrl+D,生成[EOT](End of Transmission),ASCII '\004'。作为内容,显示为
^D。示例。在CMD中,
-
对
findstr命令:>findstr "b" abc ;输入 ^d ;输入Ctrl-D abc ;输出,找到的结果 ^z ;输入Ctrl-Z,退出 >findstr "b" ac ;输入 ^d ;输入Ctrl-D(未找到,其后无输出) ^z ;输入Ctrl-Z,退出 >_ -
对
set /p var=命令,Ctrl-D、Ctrl-Z都可以结束。
-
-
-
在Lua中,正文中的控制字符无特殊意义。
即,'\004\026\0'不产生控制作用。参见:
- command line - How to signal the end of stdin input - Unix & Linux Stack Exchange
- windows - terminating input in cmd - Stack Overflow
- command line - How to signal the end of stdin input - Unix & Linux Stack Exchange
- c - EOF in the middle of an input - Stack Overflow
- How would you represent EOF in bash? - Stack Overflow
命令
echo命令
不使用输入流。
如echo 12 | echo会显示"ECHO 处于打开状态。",如同单独的echo命令(管道无作用)。
建议使用echo(+正文内容((后无空格)形式。
set命令
set /p var=,接受的输入流仅可以是单行。
建议使用set /p "var=",带双引号。
call命令
形式call :<label> arg(之一)。
arg可以"%var%",使用双引号(类似set),再在子命令内使用%~1解析掉双引号。
其他
- If - Conditionally perform command - Windows CMD - SS64.com
if | Microsoft Docs - For - Loop through command output - Windows CMD - SS64.com
- Findstr - Search for strings - Windows CMD - SS64.com
Delayed Expansion
-
运行时执行变量解析,而非加载代码块时。
-
使用
!作为变量名分隔符/标记,解析变量。
如!var!。区分于%var%。 -
需要在环境中开启。
- 使用
com /v:on(/v:off) - batch内
setlocal DisableDelayedExpansion、setlocal EnableDelayedExpansion,搭配endlocal。
- 使用
-
有作用范围(
()parentheses)问题。
参考:
- EnableDelayedExpansion - Windows CMD - SS64.com
- batch file - Why does delayed expansion fail when inside a piped block of code? - Stack Overflow
其他
CMD BAT 概要windows - Command to run a .bat file - Stack Overflow
检索关键词index:cmd command batch, findstr find, stdin input, redirect pipe, read write dynamic realtime, flush refresh buffer, block wait hang, control character signal, Ctrl-D ^D, Ctrl-Z ^Z
纪念下过程,目的向导,七零八碎的拼凑起来,测试完善,但仍不够系统..


浙公网安备 33010602011771号