如果出现错误,如何从命令提示符重定向stdout和stderr输出?

时间:2016-03-16 18:33:21

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

我有一个批处理文件(.cmd文件),每行有数百万个重命名命令。每行是来自数据库的UNC路径,该路径具有基于表中列出的扩展名的新名称。无论如何,我知道,如果我添加2>& 1然后我可以获得stderr和stdout,因此,我可以识别存储中不存在哪些文件。但是因为有数百万个文件,所以如果没有找到特定文件,我宁愿只记录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,那么我会收到错误消息: " REN \ nas0i08lv \ DATA \ HPFArchive \ app_hpf \ fcfs_data \ HPF01 \ Arch048 \ 17 \ 88 88.TIF 系统找不到指定的文件。"

由于每个批处理文件中可能有数百万个命令行,因此我只需要记录包含命令的错误,如上面的示例错误所示。

1 个答案:

答案 0 :(得分:0)

不,只有在发生错误时才能有选择地重定向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(
    )
  )
)