【问题标题】:How to redirect stdout and stderr output from command prompt ONLY when there is an error?仅当出现错误时,如何从命令提示符重定向 stdout 和 stderr 输出?
【发布时间】:2016-03-16 18:33:21
【问题描述】:

我有一个批处理文件(.cmd 文件),每行包含数百万个重命名命令。每一行都是来自数据库的 UNC 路径,具有基于表中列出的扩展名的新名称。无论如何,我知道如果我添加 2>&1 那么我可以获得标准错误和标准输出,因此,我可以识别哪些文件不存在于存储中。但是由于有数百万个文件,我希望我们只在未找到特定文件的情况下才将 stdout 和 stderr 一起记录。换句话说,仅在运行命令时出现错误时记录。我在 Windows 7 上运行它。

REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\84 84.TIF
REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\85 85.TIF
REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\86 86.TIF
REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\87 87.TIF
REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\88 88.TIF

假设如果存储中不存在文件 88.TIF,那么我将收到一条错误消息: "任\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\88 88.TIF 系统找不到指定的文件。”

由于每个批处理文件中可能有数百万条命令行,我只需要使用上面示例错误中所示的命令记录我看到错误的那些。

【问题讨论】:

  • 您应该提供示例和代码片段...

标签: batch-file command-line stdout stderr file-rename


【解决方案1】:

不,您不能仅在发生错误时选择性地重定向 stderr 和 stdout。但你不需要这样做。您可以知道您尝试删除的文件是什么,因此您所需要的只是检测错误的能力,然后编写您想要的任何消息。

我会将您的代码重组为:

@echo off
call :REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\84 84.TIF
call :REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\85 85.TIF
call :REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\86 86.TIF
call :REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\87 87.TIF
call :REN \\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\88 88.TIF
exit /b

:ren
>>error.log 2>&1 (ren %1 %2 || (
  REN %1 %2 FAILED
  echo(
)
exit /b

或者可能是这样的:

@echo off
>error.log 2>&1 (
  for %%F in (
    "\\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\84|84.TIF"
    "\\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\85|85.TIF"
    "\\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\86|86.TIF"
    "\\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\87|87.TIF"
    "\\nas0i08lv\DATA\HPFArchive\app_hpf\fcfs_data\HPF01\Arch048\17\88|88.TIF"
  ) do for /f "tokens=1,2 delims=|" %%A in (%%F) do (
    ren "%%A" "%%B" || (
      echo REN "%%A" "%%B" FAILED
      echo(
    )
  )
)

【讨论】:

  • 谢谢先生的建议。但是,您建议的以前的代码设计根本不起作用。它既不重命名目标测试文件,也不创建日志。后一种代码设计不会重命名文件,而是会在不应该出现的地方出错。给出的错误:“文件名、目录名或卷标语法不正确。REN "REN C:\Users\ahmedamm\Desktop\HPF_Test\Image" "Image.TIF" FAILED"。仅供参考,我过去没有使用过批处理编程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2010-11-28
  • 2018-08-24
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多