Копирование пользовательских профилей в пакетный файл с возрастными ограничениями

#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