【问题标题】:Redirecting output to a command-line argument of another command in Windows将输出重定向到 Windows 中另一个命令的命令行参数
【发布时间】:2010-11-28 09:20:24
【问题描述】:

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

太清楚了:我有另一个需要参数 arg 的脚本,例如:

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 以从标准输入中读取。这似乎是一个更好的解决方案。

【问题讨论】:

  • 如果您告诉我们“其他脚本”做什么从那时起读取的内容(如果不是标准输入)将会对我们有所帮助。

标签: windows command arguments


【解决方案1】:

注意:所有这些都要求命令位于批处理文件中。因此双 % 符号。

您可以使用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

【讨论】:

  • 我正要发布相同的答案。你打我! :)
  • 对于非批处理文件使用,如果您确实希望第二个脚本在每一行上运行,则以下工作 cmd /v:on 然后 for /f "delims=" %x in ('findstr string files_eg*.csv') do ( set y=%x & set z=!y::=,! & echo !z!) >> results.txt (用逗号替换冒号)跨度>
【解决方案2】:

您可以将第一个脚本的输出保存到环境变量中,并将其内容用作第二个脚本的命令行参数,如果您愿意的话。

类似这样的:

for /f "delims=" %a in ('first_script.cmd') do @set ouput=%a
second_script %ouput%

【讨论】:

    【解决方案3】:

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

    或在标准输入和输出上使用命名管道而不是管道。

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

    【讨论】:

      【解决方案4】:

      你不是让事情变得比必要的复杂吗?

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

      【讨论】:

      • 问题是(曾经)AnotherScript 需要一个参数,而这个参数是scriptB 的返回值。
      • 脚本B | xargs 另一个脚本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2010-09-09
      • 2012-10-25
      • 2013-11-08
      • 2019-08-26
      相关资源
      最近更新 更多