批处理文件复制具有年龄限制的用户配置文件
Batch File Copy User Profiles With an Age Limitations
我认为这很容易,但我被卡住了。我有一个批处理文件,可以让我备份所有 'Actual'(不是系统)用户配置文件,这很好并且工作正常。但是,必须对正在备份的配置文件文件夹应用期限限制。只允许备份最后修改日期为 60 天的所有用户配置文件文件夹,而不是盲目复制全部(时间和磁盘 space 等)
我认为将 /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
所以我的问题是,如何让它检查用户配置文件文件夹的最后修改日期并备份它(包括 subfolders/files 可能超过 60 天)只要 root 用户配置文件文件夹在最近 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)(9 月 1 日 11:00pm 00 秒),我想我可以使用 GTR 开关来对付它然后 robocopy %%b
但它没有回显...不确定发生了什么,就像我回显 %%a & %%b 他们解决了我想要的片段...欢呼
以下脚本可能会完成您想要的(请参阅代码中的 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
我认为这很容易,但我被卡住了。我有一个批处理文件,可以让我备份所有 'Actual'(不是系统)用户配置文件,这很好并且工作正常。但是,必须对正在备份的配置文件文件夹应用期限限制。只允许备份最后修改日期为 60 天的所有用户配置文件文件夹,而不是盲目复制全部(时间和磁盘 space 等)
我认为将 /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
所以我的问题是,如何让它检查用户配置文件文件夹的最后修改日期并备份它(包括 subfolders/files 可能超过 60 天)只要 root 用户配置文件文件夹在最近 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)(9 月 1 日 11:00pm 00 秒),我想我可以使用 GTR 开关来对付它然后 robocopy %%b 但它没有回显...不确定发生了什么,就像我回显 %%a & %%b 他们解决了我想要的片段...欢呼
以下脚本可能会完成您想要的(请参阅代码中的 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