此批处理的作用是设置错误日志,设置DoW和日期\时间,复制特定文件(维护源和目标之间的目录结构),并根据保留期限清理目标。除错误记录外,一切正常。问题是它没有按照我想要的方式将文本输出到日志,只是按照应该的方式跳转到所有出口(例如,它确实输出了开始日期\时间,退出句子“过程完成“,以及结束日期\时间 - 但不是上面的任何错误文本,即使遇到错误代码,它仍会处理清理工作。”
我知道我在那里遇到了一些问题,但我无法弄明白(我所看到的一切都不起作用 - 包括与我们组织的专业开发人员交谈)。我希望有人在这里有一些关于这个问题的想法(是的,我知道可能有更好的方法来做到这一点,但这既是我所知道的,也是我从现有的批处理文件和在线研究中拼凑出来的所以我没有必要重新发明轮子 - 它本来是一个快速简单的解决方案,用于将文件从一个位置复制到另一个位置,保持目标位置清洁并记录活动的特定需求。到目前为止,我已经能够解决其他问题,但这个问题。非常感谢任何建议。
编辑:所以我发现没有复制文件时返回的错误级别是0.但如果现在是这种情况,那么命令的语法参考不仅不正确,而且我不知道它是否处理一个正确的退出(它复制了所有找到的新文件,现在需要完成清理部分并从那里继续)。 @echo off
SET ERRLOG=c:\backupcopy2.log
:: ------------------ Date and Time Modifier ------------------------
:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP
:: CREATE VARIABLE %TIMESTAMP%
for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"prompt $D $T"') do (
for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
set dow=%%i
set mm=%%j
set dd=%%k
set yy=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)
:: ensure that hour is always 2 digits
if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09
:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "
set timeStamp=%mm%%dd%%yy%_%hh%%min%%sec%
:: --------- TIME STAMP DIAGNOSTICS -------------------------
:: Un-comment these lines to test output
:: echo dayOfWeek = %dow%
:: echo year = %yy%
:: echo month = %mm%
:: echo day = %dd%
:: echo hour = %hh%
:: echo minute = %min%
:: echo second = %sec%
:: echo hundredthsSecond = %hsec%
:: echo.
:: echo Hello!
:: echo Today is %dow%, %mm%/%dd%/%yy%.
:: echo.
:: echo Your timestamp will look like this: %timeStamp%
:: echo.
:: echo.
:: echo.
:: pause
:: --------- END TIME STAMP DIAGNOSTICS ----------------------
:: Log start time
@echo === %dow% %timestamp% : Start === >> %ERRLOG%
:: Copy latest BAK files from X to Z and retain folder structure
xcopy x:\*.pbk z:\ /v /q /d /i /s
IF %ERRORLEVEL% EQU 1 goto nofiles
IF %ERRORLEVEL% EQU 4 goto lowmemory
IF %ERRORLEVEL% EQU 5 goto writeerror
IF %ERRORLEVEL% EQU 0 goto cleanup
:nofiles
echo No files were found to copy >> %ERRLOG%
goto exit
:lowmemory
echo Insufficient memory to copy files or invalid drive or command-line syntax >> %ERRLOG%
goto exit
:writeerror
echo A disk write error occurred >> %ERRLOG%
goto exit
:: Deletes files older than 30 days - modify the /d to change the retention period
:cleanup
for /D %%X IN (z:\0*.) DO forfiles /p %%X /s /m *.pbk /c "cmd /c if @isdir==FALSE del @file" /d -30
:exit
echo The process completed >> %ERRLOG%
:: Log end time
:: ------------------ Date and Time Modifier ------------------------
:: THIS CODE WILL DISPLAY A 2-DIGIT TIMESTAMP
:: CREATE VARIABLE %TIMESTAMP%
for /f "tokens=1-8 delims=.:/-, " %%i in ('echo exit^|cmd /q /k"prompt $D $T"') do (
for /f "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
set dow=%%i
set mm=%%j
set dd=%%k
set yy=%%l
set hh=%%m
set min=%%n
set sec=%%o
set hsec=%%p
)
)
:: ensure that hour is always 2 digits
if %hh%==0 set hh=00
if %hh%==1 set hh=01
if %hh%==2 set hh=02
if %hh%==3 set hh=03
if %hh%==4 set hh=04
if %hh%==5 set hh=05
if %hh%==6 set hh=06
if %hh%==7 set hh=07
if %hh%==8 set hh=08
if %hh%==9 set hh=09
:: assign timeStamp:
:: Add the date and time parameters as necessary - " yy-mm-dd-dow-min-sec-hsec "
set timeStamp=%mm%%dd%%yy%_%hh%%min%%sec%
@echo === %dow% %timestamp% : End === >> %ERRLOG%