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
得在括号外。
A > B
、C < D
,是执行前的赋值操作,传递关于输入、输出流之环境(广义的参数)。
-
"执行前的赋值":类似于(狭义的)传递参数,不过位置宽松,形式不同于
Command Arg Arg2 ..
。 -
"环境":类似upvalue。
-
赋值顺序:
从前往后,后面的会覆盖前面的。
可以在前面放置默认值,不影响后半部分覆盖。
如
3>>%default% 1>>&3
,设置流1默认为default。3
作为中间/临时/中转流,初始为空。- 不可直接
1>>%default%
,否则,若default==&1
,则相当于1>&1
,会报错"重定向句柄 1 时,无法复制此句柄。"
-
来自设备、(广义)文件的数据流。描述:
-
系统默认,使用流编号:
如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 12 | echo
会显示"ECHO 处于打开状态。",如同单独的echo
命令(管道无作用)。
建议使用echo(
+正文内容((
后无空格)形式。
set /p var=
,接受的输入流仅可以是单行。
建议使用set /p "var="
,带双引号。
形式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
-
运行时执行变量解析,而非加载代码块时。
-
使用
!
作为变量名分隔符/标记,解析变量。 如!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
纪念下过程,目的向导,七零八碎的拼凑尝试,但仍不够系统..