2015-05-19 190 views
-1

进出口运行一个批处理文件从一个位置复制到另一个文件, 脚本示例:重定向批处理文件脚本输出

副本“d:\项目\ proj1 \附件\ 23220080”“C:\附件”
复制“d:\项目\ proj1 \附件\ 23220080”“C:\附件”

有一些8K复制像上面的命令,问题是有些文件是从位置失踪,我需要登录那些一个文本文件。有什么办法可以做。 基本上,当有任何错误抛出像系统无法文件指定的文件,输出和脚本
例如: 复制“d:\ Projects \ proj1 \ attachments \ 23220080”“c:\ attachments” 系统无法文件指定文件

需要记录在输出文件中。

+0

您使用的是Windows吗? –

回答

0

对于任何单个语句,您可以使用||执行错误语句。

copy %source% %destination% || echo Could not copy %source% to %destination% >> failure.log 

这可以是任何声明。如果您有特定信息需要登录变量,请更改echo文本以包含该变量。如果您需要多条语句,则可以使用带批处理标签的call以完成错误子例程。

copy %source% %destination% || call :copy_failed 

.... 

:copy_failed 
echo Could not copy file ID# %id% to %destination% >> failure.log 
rem More custom error handling here 
goto :eof 

你不说你是怎么得到的源文件,但我会建议进行维修的缘故使用for循环来应用它。

for /f %%a in (sourcefiles) do (copy %%a %destination% || echo whoops!>>failure.log) 

当然,修改8k行代码可能会更容易。

+0

我已经从数据库中提取了文件列表,创建了一个8k复制语句的批处理文件,并在应用服务器上运行它。另外我还需要记录文件ID,如果复制“d:\ Projects \ proj1 \ attachments \ 23220080失败,在失败日志中它应该记录文件ID而不是消息。 – roshanK

+0

您可以将'echo'行更改为任何命令如果你在一个变量中有ID,那么你可以为任何失败的语句运行一个完整的子程序'copy xy || call:copy_error' –

0

您可以用2> filename捕获错误。

copy "d:\Projects\proj1\attachments\23220080" "c:\attachments" 1>copy.log 2> err.log 

如果你想他们两个在一起

copy "d:\Projects\proj1\attachments\23220080" "c:\attachments" 1>copy.log 2>&1 

就像您在* nix做什么。

0
@echo off 
setlocal enabledelayedexpansion 
for /f %%i in (d:\Projects\proj1\attachments) do (
copy %%i c:\attachments 
if %errorlevel% NEQ 0 echo error on %%i >>errorlog.txt 
) 
echo done. 

另存为copier.bat

0

一个通用的解决方案:让你的日志文件提前

让我们去了所有的可能性,在接下来的批处理文件copy sourcefile targetfolder指令(S)命名30332428copier.bat

@echo off 
copy "D:\bat\Unusual Names\1exclam!ation.txt" "D:\test\a b" 
copy "D:\bat\Unusual Names\2exc!lam!ation.txt" "D:\test\b a" 
copy "D:\bat\Unusual Names\3exc!lam!ati!on.txt" "D:\test\a b" 
copy "D:\bat\Unusual Names\4exc!lam!ati!on!.txt" "D:\test\n n" 

该文件涵盖了所有组合:

  • 的和第二源文件存在为第3个第4个个没有。
  • 目标文件夹a b(在和命令)存在,而文件夹b an n没有。

然后,运行下一个脚本

@ECHO OFF 
SETLOCAL enableextensions 
for /F "usebackq skip=1 tokens=1*" %%F in (
     "D:\bat\StackOverflow\30332428copier.bat" 
) do (
    set "sourcefile=" 
    set "targetfldr=" 
    set "firstGtoken=TRUE" 
    for %%H in (%%G) do (
     if defined firstGtoken (
      if exist "%%~H" (
       set "sourcefile=%%~H" 
      ) else (
       echo source not found "%%~H" 
      ) 
      set "firstGtoken=" 
     ) else (
      rem destination folder 
      if exist "%%~H\\\" (
       set "targetfldr=%%~H" 
      ) else (
       echo target not found "%%~H" 
       rem instead echo, we could make it as follows: 
       rem md "%%~H" 
      ) 
     ) 
    ) 
    if defined sourcefile if defined targetfldr (
     rem   all ok? 
     rem   What if sourcefile exists in targetfldr? 
     echo %%F %%G 
     rem   in addition to (or instead of) echo, we could `execute` the command 
     rem   removing leading `rem` from next line 
     rem %%F %%G 
    ) 
) 

我们得到下一输出

==>D:\bat\StackOverflow\30332428.bat 
copy "D:\bat\Unusual Names\1exclam!ation.txt" "D:\test\a b" 
target not found "D:\test\b a" 
source not found "D:\bat\Unusual Names\3exc!lam!ati!on.txt" 
source not found "D:\bat\Unusual Names\4exc!lam!ati!on!.txt" 
target not found "D:\test\n n" 

==> 

最后,我们可以运行30332428.bat>copylog.txt,从而获得所需的记录。

还有最后一个问题:如果sourcefile存在于targetfldr会怎么样?如果出现问题并且30332428copier.bat脚本因某种原因挂起而应该重复运行,该怎么办?

相关问题