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

Я думал, что это будет легко, но я застрял. У меня есть пакетный файл, который позволит мне создать резервную копию всех «фактических» (не системных) пользовательских профилей, которые работают нормально. Однако необходимо применять ограничение по возрасту для резервных копий папок профиля. Разрешено только резервное копирование всех папок профилей пользователей с датой последнего изменения 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, они разрешают фрагменты, которые я хочу... ура

Мне кажется, что вам может быть лучше просто создать резервную копию их всех с помощью Robocopy и позволить ему справиться с остальными. Если вы посмотрите на его параметры выбора файлов, вы должны рассмотреть его /M и / или, возможно, его параметры /XC, /XN, /XO, /XX, /XL, /IS и /IT.

Compo 12.12.2020 17:51

Параметр /MAXAGE для robocopy используется для каждого файла отдельно. Но вы можете запросить свойство LastUseTime: wmic path Win32_UserProfile where "Special!=TRUE and LastUseTime is not null" get LastUseTime,LocalPath /VALUE; это требует некоторой арифметики дат, но это возможно, в частности, из-за возвращаемого стандартизированного формата даты/времени, независимого от языкового стандарта…

aschipfl 12.12.2020 18:16

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

Compo 12.12.2020 18:34

Спасибо! Я что-то получаю с aschipfl, но снова застреваю, обновил OP ...

Tika9o9 12.12.2020 21:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
313
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующий скрипт может выполнить то, что вы хотите (см. 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

Другие вопросы по теме