Я хочу создать пакетный файл, который будет удалять папки в указанном месте назначения, а затем скопировать все папки, измененные после 7 часов утра вчера, из моего источника; это потому, что я хочу иметь возможность запускать это ежедневно, в 7 утра.

Операционная система, которую я собираюсь использовать, - Windows Server 2003.

Таким образом, в основном я хочу иметь возможность заменить текущее содержимое папки всеми измененными файлами за последние 24 часа.

2 ответа2

2

Windows XP добавила множество функций для пакетных параметров и команд, но они не так просты в использовании. Будьте очень осторожны с цитатами, так как файлы могут содержать пробелы. Я сохранил кавычки вокруг имен файлов, так как это более полезно.

Как правило, начинать с пакета - "помощь" (естественно, в оболочке CMD). Тогда "CMD /?", "задавать /?", "за /?"а также пакетный веб-сайт Microsoft. Это то, что я сделал - он не завершен, но распечатает файлы, измененные со вчерашнего дня в 7 утра. Я могу добавить дополнительные биты, если хотите. Я сохраню это сам, так как иногда хочу знать, какие файлы я изменил сегодня!

(Отредактировано: вчера сложнее, чем просто вычесть одно из дня! ...)

@echo off

setlocal

rem Start at current directory. Customise as you wish.

set my_root=.

rem First get yesterday at 7am.
rem The format of %DATE% depends on locale so this is a
rem hack using a tmp file in VBScript...
rem Note the use of the caret, which is the batch escape character

echo yday = DateAdd("d", -1, Date) > "%temp%\tmp$$$.vbs"
echo Wscript.Echo DatePart("yyyy",yday) ^& Right("0" ^& DatePart("m",yday), 2) ^& Right("0" ^& DatePart("d",yday), 2) >> "%temp%\tmp$$$.vbs"

for /F %%a in ('cscript //nologo "%temp%\tmp$$$.vbs"') do set after_ymd=%%a

if exist "%temp%\tmp$$$.vbs" del "%temp%\tmp$$$.vbs"

set after_time=0700

echo Files after: %after_ymd% %after_time%

for /R %my_root% %%f in (*.*) do call :checkdate "%%f" "%%~tf"

goto :EOF


:checkdate

set fname=%1
set fdate=%2

for /f "tokens=1-5 delims=./-: " %%a in (%fdate%) do (
    set f_d=%%a
    set f_m=%%b
    set f_y=%%c
    set f_hr=%%d
    set f_mn=%%e
)

if %f_y%%f_m%%f_d% LSS %after_ymd% goto :EOF

if %f_y%%f_m%%f_d% EQU %after_ymd% if %f_hr%%f_mn% LSS %after_time% goto :EOF

REM Copy your file here...

echo Newer: %fname%

goto :EOF

Обратите внимание, что отображение VBScript в пакетном файле подвержено ошибкам и является грязным. Предпочтительным методом является создание фиксированного файла VBS, который можно вызывать по желанию. Другой способ - добавить vbscript в конец пакетного файла, пометить каждую строку тегом, убедиться, что перед сценарием указано goto:EOF, и использовать findstr в самом сценарии для извлечения строк (да, это неприятно):

echo off & setlocal enableextensions
rem Build a script:
findstr "'VBS" "%~f0" | findstr /v "findstr" > %TEMP%\tmp$$$.vbs

....

goto :EOF
'
'VBS
DateAdd("d", -1, Date) 'VBS
Wscript.Echo DatePart("yyyy",yday) & Right("0" & DatePart("m",yday), 2) & Right("0" & DatePart("d",yday), 2) 'VBS

Да. Мне не приятно.

0

Что ж, я рекомендую вам установить PowerShell на ... с любого устройства, с которого вы его запускаете, и вы можете быть довольны результатами.

# Define the folder that you want to copy FROM
$SourceFolder = "D:\test"

# Define the folder that you want to copy FROM, AND DELETE CONTENTS FROM BEFORE DOING SO
$DestinationFolder = "D:\testTarget"

# Make any changes to what criteria you want for the copying
$CopyingCriteria = $( Get-ChildItem $SourceFolder | Where-Object { $_.LastWriteTime -gt ((Get-Date).AddDays(-1)) } )

If ( $CopyingCriteria ) {
    # Delete the items of the folder
    Get-ChildItem $DestinationFolder | Remove-Item -Force

    # Copy the files that have changed using criteria already defined
    $CopyingCriteria | Copy-Item -Destination $DestinationFolder -Force

} 

Сохраните его как as-you-want.ps1, убедитесь, что вы установили политику выполнения на Unrestricted (или подпишите выше и измените на AllSigned) и запустите!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .