#windows #batch-file #cmd #robocopy
#Windows #пакетный файл #cmd #robocopy
Вопрос:
Я думал, что это будет легко, но я застрял. У меня есть пакетный файл, который позволит мне создавать резервные копии всех «фактических» (не системных) пользовательских профилей, которые работают нормально и работают хорошо. Однако для папок профиля, для которых выполняется резервное копирование, должно быть применено ограничение по возрасту. Разрешено только резервное копирование всех папок пользовательских профилей с датой последнего изменения 60 дней, а не просто слепое копирование всего (время, дисковое пространство и т. Д.)
Я думал, что достаточно добавить переключатель /MAXAGE в строку robocopy, но, похоже, даже если профиль недавно активен (в соответствии с критериями копирования даты), важные файлы старше 60 дней в структурах папок не учитываются — что нехорошо!
Я заглянул в Forfiles, который, казалось, был бы полезен, но не касается дат папок, только файлов (кажется?). Также переключатель Dir / T: W, но выводит синтаксис, который я не могу вписать в текущий пакетный файл.
Вот код…
@echo off
pushd %~dp0
color 5F
for /F "Skip=1 Tokens=* Delims=" %%G in (
'"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"'
) Do for /F "delims= " %%H in ("%%G") do (
for /F "Tokens=3,4 delims=" %%I in ("%%H") do (
robocopy "%%H" "C:IT%%I" /XD AppData /XD "Application Data" /XD "Local Settings" /XD *Drive* /MAXAGE:60 /E /R:0 /XA:SH
)
)
)
pause
Итак, мой вопрос в том, как я могу заставить его проверять дату последнего изменения папки профиля пользователя и создавать ее резервные копии (включая вложенные папки / файлы, которые могут быть старше 60 дней), если в корневой папке профиля пользователя был изменен атрибут в течение последних 60 дней, иначе старше, не создавайте резервную копию.
Надеюсь, это имеет смысл, спасибо за любую информацию / советы, которые кто-нибудь может посоветовать.
C:UsersAdmin Last Mod 12/12/2020 (>backup)
C:UsersDez.Smith Last Mod 19/11/2020 (>backup)
c:UsersSmiley.Pippet Last Mod 16/09/2020 (<dont backup)
etc....
Новый код…
@echo off
color 5F
for /f "tokens=2 delims==;." %%a in ('"wmic path Win32_UserProfile where (Special!='True' and LastUseTime is not null) get LastUseTime,LocalPath /VALUE | find "LastUseTime""') Do (
for /f "tokens=2 delims==" %%b in ('"wmic path Win32_UserProfile where (Special!='True' and LastUseTime is not null) get LastUseTime,LocalPath /VALUE | find "LocalPath""') Do (
echo %%a
pause
if %%a GTR 20200109230000 echo %%b
)
)
)
pause
Из вывода команды я получаю
LastUseTime=20201212194437.654000 000
LocalPath=C:UsersAdmin
Я думал, что могу превратить это в то, что мне нужно. Итак, урезали дату только до 20201212194437, а также просто C:UsersAdmin .
Если я установлю число равным 60 дням или чему-либо 20200109230000 (%%a) (1 сентября 11:00 вечера 00 секунд) Я думал, что могу использовать переключатель GTR против него, чтобы затем robocopy %%b но он не отражается … Не уверен, что происходит, как будто я повторяю %%a amp;%%b, они разрешают нужные мне фрагменты … приветствия
Комментарии:
1. Мне кажется, что вам может быть лучше просто создать их резервные копии с помощью Robocopy и позволить ему обрабатывать все остальное. Если вы посмотрите на его параметры выбора файла, вам следует рассмотреть его
/M
и / или, возможно, его/XC
,/XN
,/XO
,/XX
,/XL
,/IS
, и/IT
параметры.2.
/MAXAGE
Опцияrobocopy
используется для каждого файла. Но вы могли бы запроситьLastUseTime
свойство:wmic path Win32_UserProfile where "Special!=TRUE and LastUseTime is not null" get LastUseTime,LocalPath /VALUE
; для этого требуется некоторая арифметика даты, но это возможно, в частности, из-за возвращаемого стандартизированного формата даты / времени, не зависящего от локали…3. Просто примите во внимание, что с помощью различных средств файлы в каталоге профиля пользователя могут быть изменены, когда пользователь не вошел в систему. Поэтому не стоит просто соглашаться с тем, что, если они не вошли в систему, никакие файлы не могли быть изменены, добавлены или удалены.
4. Спасибо! Я добираюсь до чего-то с aschipfl, но снова застреваю, обновил OP…
Ответ №1:
Следующий сценарий может выполнить то, что вы хотите (см. rem
-комментарии в коде):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_TARGET=D:BackupProfiles" amp; rem // (destination directory of the backup)
set /A "_MAXAGE=60" amp; rem // (maximum age in days of user profile)
rem // Retrieve current date/time:
for /F "delims=" %%U in ('
wmic path Win32_OperatingSystem get LocalDateTime /VALUE
') do for /F "delims=" %%V in ("%%U") do set "%%V"
rem // Loop through non-special non-roaming user profiles:
for /F "delims=" %%U in ('
wmic path Win32_UserProfile where "Special=FALSE and RoamingConfigured=FALSE and LastUseTime is not null and LocalPath is not null" ^
get LastUseTime^,LocalPath /VALUE
') do for /F "tokens=1* delims==" %%V in ("%%U") do (
rem // Store current item, which can be the last usage date or the source path:
set "%%V=%%W" amp; set "Name=%%~nxW" amp; setlocal EnableDelayedExpansion
rem // Check what the current item is:
if "%%V"=="LastUseTime" (
endlocal
rem // Current item is last usage date, so get difference to current date:
call set /A "RelUseDate=(((%LocalDateTime:~,4%*12 %LocalDateTime:~4,2%)*36525 %LocalDateTime:~6,2)-((%%LastUseTime:~,4%%*12 %%LastUseTime:~4,2%%)*36525 %%LastUseTime:~6,2%))/100"
) else if !RelUseDate! leq %_MAXAGE% (
rem // Current item is source path, so copy when last usage data is not too long ago:
ECHO robocopy "!LocalPath!" "!_TARGET!!Name!" *.* /PURGE /XD "AppData" /XJ
endlocal
) else endlocal
)
endlocal
exit /B