批处理文件脚本

时间:2015-05-19 17:36:09

标签: batch-file dos

运行批处理文件将文件从一个位置复制到另一个位置, 脚本示例:

复制“d:\ Projects \ proj1 \ attachments \ 23220080”“c:\ attachments”
复制“d:\ Projects \ proj1 \ attachments \ 23220080”“c:\ attachments”

上面有一些8K复制命令,问题是该位置缺少一些文件,我需要将它们记录到文本文件中。有什么办法可以做。 基本上当有任何错误抛出时,如系统无法归档指定的文件,那些输出和脚本
为例如:  复制“d:\ Projects \ proj1 \ attachments \ 23220080”“c:\ attachments” 系统无法归档指定的文件

需要记录在输出文件中。

4 个答案:

答案 0 :(得分: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行代码可能更容易。

答案 1 :(得分:0)

你可以用2>来捕捉错误。文件名。

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上所做的相同。

答案 2 :(得分:0)

  Set Window Size        ${0}       ${0}

另存为copier.bat

答案 3 :(得分:0)

通用解决方案:提前获取您的日志文件

让我们在名为copy sourcefile targetfolder的下一个批处理文件中查看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"

此文件涵盖所有组合:

  • 1st 2nd 源文件以 3rd 4th 不存在。
  • 目标文件夹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脚本由于某种原因而挂起,因此应该重复运行怎么办?