将Windows cmd命令的输出作为参数传递给另一个命令

29

在Linux中可以做到这一点:

git diff $(git status -s -b | sed -n '2p' | cut -d' ' -f2-)

或者更简单的情况

ls $(pwd) 
问题是如何在 Windows 中实现同样的功能?(不使用批处理文件,在命令提示符中一条语句完成)。并非所有命令都支持管道操作,因此如何执行一个命令并将结果传递给另一个命令作为参数?我已经尝试使用管道和 <>,但都没有成功。
git diff < (git status -s -b | sed -n '2p' | cut -d' ' -f2-) 

尝试一下自己操作,它需要一个文件。而且 | 也不起作用,因为 git diff 不支持它。

git status -s -b | sed -n '2p' | cut -d' ' -f2- | git diff // results in illegal seek

在Windows中使用双引号而不是单引号(与Linux上的用法不同)。 - user2956477
尝试使用 ^ 转义管道符号,例如 -s -b ^| sed - Bali C
1个回答

39

cmd 中没有 $ 运算符。重定向运算符 (<, >, >>) 要求文件或流句柄。一个管道 | 将一个命令的标准输出传递给另一个命令的标准输入。

然而,for /F 循环 可以捕获命令的输出并将其提供给一个变量引用(在示例中为 %A);请参考以下代码:

for /F "usebackq delims=" %A in (`git status -s -b ^| sed -n '2p' ^| cut -d' ' -f2-`) do git diff %A

这正是我一直在寻找的。更新 for for /F "usebackq delims=" %A in (\git status -s -b ^| sed -n '$1p' ^| cut -d" " -f3`) do git diff %A $2 $3 $4($n 是此别名的命令行参数),它将根据 git status` 输出中的编号差异正确的文件。 - Arijoon
39
Linux 中一切都是如此简单。 - Patrick Michaelsen
4
我刚刚花了将近一个小时的时间编写一个三行的BASH脚本,因为(1)别名在shell脚本中不起作用,(2)如果你使用var=$(cmd)来将命令输出赋值给变量,而该输出中包含JSON格式的数据,那么JSON数据会被破坏。所以也许我们可以认为BASH和WINBAT都很糟糕? :) - bigjosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接