【问题标题】:Windows cmd pass output of one command as parameter to anotherWindows cmd 将一个命令的输出作为参数传递给另一个
【发布时间】:2017-08-30 18:10:25
【问题描述】:

在 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 上一样)。
  • 尝试使用^ 转义管道,即-s -b ^| sed

标签: windows shell cmd pipe command-prompt


【解决方案1】:

cmd 中没有 $ 运算符。
重定向运算符(&lt;&gt;&gt;&gt;)需要文件或流句柄。
管道| 将命令的标准输出传递到另一个命令的标准输入。

然而,for /F loop 能够捕获命令的输出并在变量引用中提供它(示例中为%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 输出中区分正确的文件
  • 在linux中一切都那么简单
  • @PatrickMichaelsen 我刚刚花了一个多小时在一个 3 行 BASH 脚本上,因为 (1) alias 只是不能在 shell 脚本中工作,(2) 如果你分配输出对带有var=$(cmd) 的变量的命令并且该输出中包含JSON,然后JSON 被破坏。所以也许我们可以同意 BASH 和 WINBAT 都很糟糕? :)
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2014-12-03
  • 2012-07-08
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多