【问题标题】:Redirect output from exe with parameters through batch file通过批处理文件使用参数重定向exe的输出
【发布时间】:2017-06-11 17:46:35
【问题描述】:

我需要通过批处理文件运行 .exe 文件并将其输出重定向到文本文件。 问题是exe的路径和它获取的参数有很多空格和反斜杠,我无法让它工作。 它要么创建一个空白 txt 文件,要么根本不运行我的命令(错误地解析命令)。

exe路径:C:\Program Files (x86)\A S\Tools\Image\Image.exe
参数:
1) -v
2) C:\Program Files (x86)\A S\MyFiles\file_00_00_65
3) /0 /1 /2 /3 /5
4) C:\Program Files (x86)\A S\MyFiles\file_00_00_65\Images\AB.dtb

我尝试了以下解决方案:

一)

    start "" "cmd /c ""C:\\Program Files (x86)\\AS\\Tools\\Image\\Image.exe" -v "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65" /0 /1 /2 /3 /5 "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65\\Images\\AB.dtb"" > Logs.txt 2>&1"

失败:找不到“C:\Program Files (x86)\A S\MyFiles\file_00_00_65\Images\AB.dtb”。

B)

    start "" cmd /c ""C:\\Program Files (x86)\\AS\\Tools\\Image\\Image.exe" -v "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65" /0 /1 /2 /3 /5 "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65\\Images\\AB.dtb"" > Logs.txt 2>&1

失败:创建一个空的 txt 文件。

C)

    >Logs.txt 2>&1 (
     start "" cmd /c ""C:\\Program Files (x86)\\A S\\Tools\\Image\\Image.exe" -v "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65" /0 /1 /2 /3 /5 "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65\\Images\\AB.dtb"" 
     )

失败:“\A 在这个时候是意外的。”

D)

    cmd /c ""C:\\Program Files (x86)\\A S\\Tools\\Image\\Image.exe" -v "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65" /0 /1 /2 /3 /5 "C:\\Program Files (x86)\\A S\\MyFiles\\file_00_00_65\\Images\\AB.dtb"" > Logs.txt | type Logs.txt

失败:创建一个空的 txt 文件。

我也试过 start /B /wait... 等等。

【问题讨论】:

  • 请确认您发布的代码 - 最好剪切并粘贴原件。我在案例 A) 中观察到,例如,您在代码路径中发布了 AS,而不是 A S,但您声称有响应(可能来自可执行文件),因此找到了可执行文件。响应似乎表明引号被错误地解释了——我会删除cmd/c 及其周围的引号并自己处理双"——但我无法测试它,因为我没有有问题的可执行文件。
  • 我尝试按照您的建议进行操作,但 txt 文件为空。我无法添加 exe 文件,因为它是作为黑匣子给我的。

标签: batch-file cmd output exe


【解决方案1】:

在批处理文件中使用以下命令行怎么样?

"%ProgramFiles(x86)%\A S\Tools\Image\Image.exe" -v "%ProgramFiles(x86)%\A S\MyFiles\file_00_00_65" /0 /1 /2 /3 /5 "%ProgramFiles(x86)%\A S\MyFiles\file_00_00_65\Images\AB.dtb" >"%USERPROFILE%\Desktop\Logs.txt" 2>&1

在批处理文件中,反斜杠字符不能用另一个反斜杠转义。这仅在许多编程和脚本语言中是必需的,而在批处理文件中则不需要。

START 命令在新的命令进程中运行控制台应用程序。

命令 CMD 也会启动一个新的命令进程。

但是批处理文件已经在命令进程中运行了。

所以从目前所写的内容来看,我真的不明白为什么让它变得比必要的复杂,并另外使用命令 STARTCMD

文件Logs.txt 是在您的桌面上创建的,使用该命令行可在批处理文件或快捷方式文件 (*.lnk) 中使用。

当然,应用程序Image.exe 必须是一个控制台应用程序,它编写其输出以处理 STDOUT 及其错误以处理 STDERR,以便将两者都重定向到文件 Logs.txt .无法从命令行将 Windows GUI 应用程序的输出重定向到文件。

【讨论】:

  • 当我从命令行运行批处理文件时,我确实看到了来自 exe 的日志,但 txt 文件是空的。我希望能够检查短语 * * * Complete * * * 是否出现在日志中,以确保 exe 成功。这就是为什么我想将日志重定向到文件(然后在文件中搜索短语)。我对其他想法持开放态度..
  • 对于>"%USERPROFILE%\Desktop\Logs.txt" 2>&1,当Image.exe 是使用标准句柄stdout 和stderror 的真正Windows 控制台应用程序时,实际上不可能将某些内容打印到屏幕上。所以看起来Image.exe 不是一个标准的控制台应用程序,因此如果没有这个可执行文件或不了解它,我无法为您提供帮助。它可能是一个“编译”(打包)成可执行文件的批处理文件,它可以为自己打开一个新的命令进程来输出它的消息,它可以使用其他句柄,......我只能猜测,这总是浪费时间.
【解决方案2】:

如果您愿意等待程序完成,不确定为什么要使用 start 或 cmd。如果它只是传递混淆的参数,那么沿着这条线应该可以工作:

set a1="C:\Program Files (x86)\A S\MyFiles\file_00_00_65" "/0 /1 /2 /3 /5"
set a2="C:\Program Files (x86)\A S\MyFiles\file_00_00_65\Images\AB.dtb"
"C:\Program Files (x86)\A S\Tools\Image\Image.exe" %a1% %a2% >Logs.txt 2>&1

这里使用环境变量 a1a2 只是为了管理行长,使其在没有滚动的情况下可见 - 您可以删除它们并全部完成如果你愿意,可以写一行。

我引用了“/0 /1 /2 /3 /5”,因为你说这是一个单独的参数(与参数相对)。如果这些是五个单独的开关,则应删除这些引号。

【讨论】:

  • 当我从命令行运行批处理文件时,我确实看到了来自 exe 的日志,但 txt 文件是空的。我希望能够检查短语 * * * Complete * * * 是否出现在日志中,以确保 exe 成功。这就是为什么我想将日志重定向到文件(然后在文件中搜索短语)。我对其他想法持开放态度..
  • 在 DOS 框中,我将转到 Image.exe 程序所在的目录并键入 Image.exe >nul 2&>nul -- 如果屏幕上出现任何内容,您就知道 Image.exe 的输出无法重定向到文件。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多