Windows批处理中Bash的“ - ”相当于什么?

时间:2013-11-15 13:27:00

标签: windows bash batch-file cmd

在Bash中,变量 - 表示命令的stdin,对管道命令非常有用。我想知道Windows批处理文件中是否存在等效文件,我似乎无法找到答案。

这是我在绝对必要时传统上所做的事情(并且它是最有用的if语句):

<command> | set /p tmpvar=
if "%tmpvar%"=="whatever" rem stuff

我觉得做一些像你在Bash中可以做的事情会更快更容易。这是Bash中的一个等效脚本,我想要一些比Windows批处理更简单的东西(不需要DOS兼容性)。

<command> | if ("-" == "whatever" ) # stuff

是否有比上面第一个例子更简单的等价物?这会让事情变得容易多了。

3 个答案:

答案 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 forfor /?作为说明。这是一个复杂的命令。如果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;" -表现不同。