2015-05-19 138 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腳本因某種原因掛起而應該重複運行,該怎麼辦?

相關問題