我有一个批处理文件(.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 系统找不到指定的文件。"
由于每个批处理文件中可能有数百万个命令行,因此我只需要记录包含命令的错误,如上面的示例错误所示。
答案 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(
)
)
)