在Bash中,变量 - 表示命令的stdin,对管道命令非常有用。我想知道Windows批处理文件中是否存在等效文件,我似乎无法找到答案。
这是我在绝对必要时传统上所做的事情(并且它是最有用的if
语句):
<command> | set /p tmpvar=
if "%tmpvar%"=="whatever" rem stuff
我觉得做一些像你在Bash中可以做的事情会更快更容易。这是Bash中的一个等效脚本,我想要一些比Windows批处理更简单的东西(不需要DOS兼容性)。
<command> | if ("-" == "whatever" ) # stuff
是否有比上面第一个例子更简单的等价物?这会让事情变得容易多了。
答案 0 :(得分:5)
在Bash中,变量 - 表示stdin
实际上并非如此。 -
作为标准输入/输出的简写是Unix命令中的一种约定,但命令自己解释它; shell与它无关。 echo -
只打印一个破折号。
在DOS / Windows中与此约定最接近的是特殊文件名CON
,它被解释为控制台。我不认为它对管道有帮助 - 但是在Unix上,命令本身应该有一些方法告诉他们从标准输入读取。
答案 1 :(得分:3)
您声称使用的以下设计模式永远不能在Windows批处理中使用:
<command> | set /p tmpvar=
if "%tmpvar%"=="whatever" rem stuff
管道的每一侧都在自己的临时CMD.EXE线程中执行 - tmpvar
确实在线程中设置,但是一旦管道完成就会消失。请参阅jeb's answer to "Why does delayed expansion fail when inside a piped block of code?"。
在批处理中处理命令输出的最常用方法是使用FOR /F
循环。输入help for
或for /?
作为说明。这是一个复杂的命令。如果IN子句包含在IN ('someCommend')
之类的单引号中,它可以处理命令的输出。它为每行输出执行一次DO子句。它还可以将每一行解析为令牌,保留选择令牌。默认情况下,它仅处理第一个令牌,使用<space>
和<tab>
作为令牌分隔符。默认情况下,由于默认的;
选项,它也会忽略以eol
开头的行。有多种选项可以指定分隔符,要捕获的标记和eol。
例如,以下内容将简单地回显每行输出,但空行和以;
开头的行将被忽略:
for /f "delims=" %%A in ('someCommand') do echo( %%A
答案 2 :(得分:1)
在Bash中,变量 - 表示命令的stdin
不一定是真的。 -
由特定程序或命令解释,而不是shell。
cat -
读取标准输入。
cd -
或perl -e "print @ARGV;" -
表现不同。