【问题标题】:batch redirection of start command but not the process批量重定向启动命令而不是进程
【发布时间】:2018-10-03 17:23:37
【问题描述】:

我需要将 start 命令的输出重定向到 log.txt 文件(例如在路径错误的情况下),而不是它启动的进程。因为如果process.exe运行时间较长,下一个输出就不能写入日志文件了,因为它被进程锁住了。

start "" "path\to the\process.exe" >> log.txt 2>&1
echo next output >> log.txt

【问题讨论】:

  • 你用过你贴的START命令行吗?除了显示的 GUI 错误消息提示之外,它还将 START 输出的错误消息写入文件log.txt。有必要使用^ 转义每个重定向运算符>&,以免被解释为当前命令进程中命令START 的输出重定向。
  • 我当然试过了。出错时,成功重定向到log.txt。但是当它找到进程并运行它时,进程的输出也被重定向,这是我不想要的。
  • 当我尝试按照您告诉我的方式调整线路时(开始“”“path\to the\process.exe”^>^> log.txt 2^>^&1),过程是没有被重定向(这很好),但错误消息也没有重定向到日志文件。我错过了什么吗?
  • 我无法重现您的问题。启动的过程不会阻止我手中的下一个回声。启动的进程也不会写入日志。请提供有关您的流程的更多信息,并确保您告诉我们您正在使用的所有 START 参数。如果可能的话,您应该向我们提供您正在使用的确切起点。
  • 谈论这一行:start "" "path\to the\process.exe" ^>^> log.txt 2^>^&1 我想要实现的是,当 PATH 到进程写入错误或只是进程.exe不存在,将输出错误消息重定向到log.txt文件。因为现在,它会将错误消息写入控制台窗口。

标签: batch-file output-redirect


【解决方案1】:

一个选项:

@set _FILE_NOT_FOUND=2
@set _fileToRun=path\to the\process.exe
@if not exist "%_fileToRun%" @echo File to run does not exist: %_fileToRun% >> log.txt & @exit /b -%_FILE_NOT_FOUND%
@start "" "%_fileToRun%"
@if %ERRORLEVEL% neq 0 @echo Start failed with: %ERRORLEVEL%
@echo next output >> log.txt

【讨论】:

  • 虽然您的回答有效,但我有两个改进建议。 1. 在所有操作系统上,强烈建议不要以负数退出应用程序或脚本。这是可能的,但 used 应该是 0 表示成功,一个正数表示错误。所以请将第二行的结尾改为exit /b 1。 2. 避免使用if %ERRORLEVEL% NEQ 0,因为这只能在命令块之外使用。更好的是使用if errorlevel 1,它可以在批处理文件中的任何位置使用,这意味着start 的退出代码是否大于或等于1,即启动可执行文件时是否出错。
  • 在命令提示符窗口中运行 if /? 以获取有关 if errorlevel X 语法的详细信息。相反的是if not errorlevel 1,这意味着如果退出代码小于1,即如果应用程序/脚本没有以负值退出,则等于0,这对于我见过的所有应用程序和脚本都是如此,除了这个。命令 START 的退出代码见 What are the ERRORLEVEL values set by internal cmd.exe commands?
  • @Mofi,感谢您的提示。我忘了查找正确的错误信息! -1 是我的“自我说明”....我从不将 if 语句放在命令块中。我完全避免使用多行代码块,应该不惜一切代价避免它们。
  • if errorlevel 1 语义是oxymoron。顺便说一句,许多程序返回负数表示错误,返回零或正数表示成功。您永远不应该假设脚本会为失败返回正值。 Windows 批处理脚本语言薄弱且漏洞百出。
  • if errorlevel 1 的含义在命令 IF 的帮助下有清楚的解释。与编程世界一样,函数/命令的文档很重要,而不是用户对函数/命令的理解。我会对哪些程序返回负数非常感兴趣。在 25 年的计算机使用中,我从未见过一台。 Microsoft 为 Windows 和 Linux 内核文档清楚地写了负数不应该被应用程序使用。最好只使用 0 到 255(无符号字符值范围)或 0 到 65535(无符号短值范围)范围内的值。
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 2010-10-10
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多