Я думал, что это будет легко, но я застрял. У меня есть пакетный файл, который позволит мне создать резервную копию всех «фактических» (не системных) пользовательских профилей, которые работают нормально. Однако необходимо применять ограничение по возрасту для резервных копий папок профиля. Разрешено только резервное копирование всех папок профилей пользователей с датой последнего изменения 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:\Users\Admin Last Mod 12/12/2020 (>backup)
C:\Users\Dez.Smith Last Mod 19/11/2020 (>backup)
c:\Users\Smiley.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:\Users\Admin
Я думал, что я могу разделить это на то, что мне нужно. Поэтому уменьшите дату до 20201212194437, а также просто C:\Users\Admin.
Если я установил число на 60 дней или что-то еще 20200109230000 (%%a) (1 сентября 23:00 00 секунд), я подумал, что могу использовать переключатель GTR против него, чтобы затем робокопировать %%b но это не возвращается... Не уверен, что происходит, как будто я повторяю %%a и %%b, они разрешают фрагменты, которые я хочу... ура
Параметр /MAXAGE
для robocopy
используется для каждого файла отдельно. Но вы можете запросить свойство LastUseTime
: wmic path Win32_UserProfile where "Special!=TRUE and LastUseTime is not null" get LastUseTime,LocalPath /VALUE
; это требует некоторой арифметики дат, но это возможно, в частности, из-за возвращаемого стандартизированного формата даты/времени, независимого от языкового стандарта…
Просто примите во внимание, что с помощью различных средств возможно, что файлы в каталоге профиля пользователя могут быть изменены, когда пользователь не вошел в систему. изменены, добавлены или удалены.
Спасибо! Я что-то получаю с aschipfl, но снова застреваю, обновил OP ...
Следующий скрипт может выполнить то, что вы хотите (см. rem
-комментарии в коде):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_TARGET=D:\Backup\Profiles" & rem // (destination directory of the backup)
set /A "_MAXAGE=60" & 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" & set "Name=%%~nxW" & 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%00)-((%%LastUseTime:~,4%%*12+%%LastUseTime:~4,2%%)*36525+%%LastUseTime:~6,2%%00))/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
Мне кажется, что вам может быть лучше просто создать резервную копию их всех с помощью Robocopy и позволить ему справиться с остальными. Если вы посмотрите на его параметры выбора файлов, вы должны рассмотреть его
/M
и / или, возможно, его параметры/XC
,/XN
,/XO
,/XX
,/XL
,/IS
и/IT
.