在Windows中将输出重定向到另一个命令的命令行参数

6

在Windows中,我如何将脚本/命令的输出作为另一个脚本的参数使用?(这里不能使用管道|,因为另一个脚本不从标准输入读取)

需要澄清的是:我有一个需要参数arg的AnotherScript,例如:

AnotherScript 12

现在我希望参数(例如示例中的12)来自于脚本ScriptB的输出。因此,我想要类似以下的内容:

AnotherScript (ScriptB)

AnotherScript实际上是一个需要参数的Python脚本,而ScriptB是一个Cygwin Bash脚本,可以产生一些数字。因此,我想要使用它的方式类似于:

c:\Python26\python.exe AnotherScript (c:\cygwin|bin|bash --login -i ./ScriptB)

感谢提供答案。然而,由于需要冗长的'for'结构,我已经重新编写了AnotherScript以从标准输入读取数据。这似乎是更好的解决方案。


如果不是标准输入,告诉我们“其他脚本”从哪里读取数据会对我们有所帮助。 - Amber
4个回答

8

注意:所有这些都需要在批处理文件中使用命令。因此需要双倍的%符号。

您可以使用for命令来捕获命令的输出:

for /f "usebackq delims=" %%x in (`ScriptB`) do set args=%%x

然后,您可以在另一个命令中使用该输出:
AnotherScript %args%

这将导致%args%包含来自ScriptB输出的最后一行。如果它只返回一行,您可以将其合并为一行:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x

在批处理文件之外使用时,您必须使用%x而不是%%x

但是,如果ScriptB返回多行,则AnotherScript会针对这些行中的每一行运行。您可以通过在第一次循环迭代后中断来规避此问题——尽管仅限于批处理文件:

for /f "usebackq delims=" %%x in (`ScriptB`) do AnotherScript %%x & goto :eof

我正要发布相同的答案,你赢了! :) - Paulius
对于非批处理文件使用,如果你希望第二个脚本在每行上运行,则以下命令可行 cmd /v:on 然后 for /f "delims=" %x in ('findstr string files_eg*.csv') do ( set y=%x & set z=!y::=,! & echo !z!) >> results.txt(将冒号替换为逗号)。 - mpag

3
您可以将第一个脚本的输出保存到环境变量中,然后将其内容作为命令行参数传递给第二个脚本。如果您需要这样做的话。
类似于以下内容:
for /f "delims=" %a in ('first_script.cmd') do @set ouput=%a
second_script %ouput%

1

将数据保存到临时文件中?

或者使用命名管道代替标准输入和输出的管道。

或者从第一个脚本调用另一个脚本,并通过命令参数传输数据。


0

你难道不觉得自己把事情搞得比必要的还要复杂吗?

从bash中调用AnotherScript。如有必要,安装Cygwin以便执行此操作。


问题是(曾经)AnotherScript 需要一个参数,而这个参数是 scriptB 的返回值。 - Rabarberski
5
将"scriptB | xargs AnotherScript"翻译成中文:将"scriptB"的输出作为输入传递给"AnotherScript"进行处理。 - reinierpost

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