@echo off
setlocal enableextensions enabledelayedexpansion
REM Backup Script from Windows 7 to Windows 10
REM Made By Adam Avila
REM Date: 6/7/2018
Set "Destination=%UserProfile%\BackupS2018"
Set "LogDir=%Destination%\Log"
REM Determine function and set logfile path.
If exist "%Destination%" (
set "function=restore"
set "LogFile=%LogDir%\RestoreLog.txt%"
) else (
set "function=backup"
set "LogFile=%LogDir%\BackupLog.txt"
)
if not exist "%LogDir%" md "%LogDir%"
REM Each argument of "name|target" is split at the pipe to make 2 arguments.
for %%A in (
"Desktop|%UserProfile%\Desktop"
"Favorites|%UserProfile%\Favorites"
"ChromeBookmarks|%LocalAppData%\Google\Chrome\User Data\Default"
"FirefoxPath|%AppData%\Mozilla\Firefox\profiles"
"UProof|%AppData%\Microsoft\Uproof"
"Templates|%AppData%\Microsoft\Templates"
"SSH|%AppData%\SSH"
"Skype|%AppData%\Skype"
"FileZilla|%AppData%\FileZilla"
"Box|%AppData%\Box"
"Snagit|%LocalAppData%\TechSmith\SnagIt"
"Cisco|%LocalAppData%\Cisco"
"StickyNotes|%AppData%\Microsoft\Sticky Notes"
) do for /f "tokens=1,2 delims=|" %%B in ("%%~A") do call :%function% "%%~B" "%%~C"
REM Remove any possible empty folders so rerun chooses correct function.
for %%A in (
"%LogDir%"
"%Destination%"
) do if exist "%%~A" rd "%%~A" 2>nul
exit /b
:restore
setlocal
set "name=%~1"
set "target=%~2"
if "%name%" == "StickyNotes" (
2>nul taskkill /im Microsoft.Notes.exe /t /f
set "NewStickyNotes=%LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy"
robocopy "%Destination%\%name%" "!NewStickyNotes!" StickyNotes.snt /S /np /log+:"%LogFile%"
if exist "%NewStickyNotes%\StickyNotes.snt" (
rename "%NewStickyNotes%\StickyNotes.snt" ThresholdNotes.snt
)
exit /b 0
)
robocopy "%Destination%\%name%" "%target%" /S /log+:"%LogFile%"
exit /b 0
:backup
setlocal
set "name=%~1"
set "target=%~2"
if not exist "%target%" exit /b 0
if "%name%" == "ChromeBookmarks" (
if not exist "%target%\Bookmarks" exit /b 0
robocopy "%target%" "%Destination%\%name%" Bookmarks /S /np /log+:"%LogFile%"
exit /b 0
)
if "%name%" == "FirefoxPath" (
set "FileToFind=*"
for /f %%I in ('dir "%target%\!FileToFind!" /A-D /B /S 2^>nul') do (
set "firefox_profile=%%~dpI"
if "!firefox_profile:~-1!" == "\" set "firefox_profile=!firefox_profile:~,-1!"
robocopy "!firefox_profile!" "%Destination%\FirefoxBookmarks" places.sqlite /S /np /log+:"%LogFile%"
exit /b 0
)
exit /b 0
)
robocopy "%target%" "%Destination%\%name%" /S /np /log+:"%LogFile%"
exit /b 0
Вы использовали хороший шаблон с именами, поэтому я создал этот код, чтобы минимизировать дублирование имен и т. Д.
В начальном цикле for
используется шаблон name|target
, который разделяется на |
на 2 аргумента и передается call
.То, какой ярлык вызывается, зависит от того, существует ли место назначения.
robocopy
использует аргумент логирования добавления и аргумент отсутствия прогресса.robocopy
аргументы могут экранировать двойные кавычки с обратной косой чертой, т.е. \"
- это литерал "
.Таким образом, я избегал использования пути с обратной косой чертой.
Не уверен, что значение FileToFind
не определено, поэтому я установил его на *
.Цикл for
получает первую папку профиля и запускает на ней robocopy
.