2017-07-30 42 views
3

我正在生成Windows批處理腳本來複制文件,僅當更新源時。如果文件被更新,我想刪除另一個文件。從xcopy獲取通知(如果文件副本)

問題是,我無法找到發生文件更新時觸發事件的簡單方法。

我想到了使用%ERRORLEVEL%,但是這給了0是否複製文件。

我也想過將xcopy輸出保存到一個文本文件然後處理這個文件,但是這對於這樣一個簡單的任務似乎有點不切實際?

任何其他想法?

代碼到目前爲止

SET SOURCEFILE=%CD%\source.txt 
SET DELFILE=%CD%\toDelete.txt 
SET DESTDIR=%WINDIR%\Deployment\ 

xcopy "%SOURCEFILE%" "%DESTDIR%" /c /d /q /y 

REM IF File is updated, delete %DELFILE% 
+0

'for/F %% a in('xcopy'%SOURCEFILE%「」%DESTDIR%「/ c/d/q/y')do set」files = %% a「'and'if %files%gtr 0 echo文件已更新' – Aacini

+0

@Aacini完美無缺。我從來沒有完全理解FOR的批處理,但是效果很好。謝謝 – EcksMedia

回答

1

我解釋張貼Aacini對整批產品代碼的命令行中使用的方法:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

set "SourceFile=source.txt" 
set "DeleteFile=toDelete.txt" 
set "DestinationDirectory=%SystemRoot%\Deployment\" 

for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%SourceFile%" "%DestinationDirectory%" /C /D /Q /Y 2^>nul') do set "CopiedFilesCount=%%I" 

if %CopiedFilesCount% GTR 0 del "%DeleteFile%" 

rem Add here more command lines using one of the 3 environment variables define above. 
endlocal 

首先,它是在複製一個文件與XCOPY非常重要目標目錄路徑以反斜槓結尾,否則XCOPY會提示目標是目錄還是文件。

XCOPY這裏使用的總輸出處理STDOUT作爲最後一行在甚至已經開始被複制與文件數量的信息消息時沒有被複制或時發生錯誤。

命令FOR在背景單獨的命令處理執行XCOPY捕獲這個輸出處理STDOUT和逐行處理它。

使用此處使用的默認選項忽略以分號開頭的空行和行,並且沒有eol=選項。其他行的處理方式是將每行分割爲由空格或水平製表符分隔的字符串,因爲沒有delims=選項,所以使用此處使用的默認分隔符。由於沒有使用tokens=選項,因此每行的第一個空格/製表符分隔的字符串被分配給循環變量I,該行的其餘部分將被忽略。

循環變量I的當前值在每條處理線上分配給環境變量CopiedFilesCount替換其以前的值。

第一空間/製表符分隔的上最後一行輸出串由XCOPY是複製的文件的數目是在這裏複製只是一個單一文件或者01。因此,最後在FOR循環執行完成後,環境變量CopiedFilesCount的值爲01

值與GREATER THAN操作員命令相比IF以確定該文件是在這種情況下,其他文件被刪除複製。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
+0

這是一個很好的解釋Mofi,非常感謝。 – EcksMedia