Для резервного копирования можно использовать ту или иную, зависящую от конкретного случая, "обертку" для xcopy. Как вариант, скрипт с диалоговым выбором целевого каталога копирования. Список исходных каталогов для копирования содержится в файле copylist.txt рядом с файлом скрипта. Знак "-" перед путем каталога отменяет его обработку. Пути каталогов заключены в кавычки. Ключ /d xcopy позволяет только обновлять резервные копии файлов.
ОС Win7
xcpy.cmd
@set @x=1/*
::
:: Резервное копирование с помощью xcopy с выбором целевого каталога копирования.
:: Список каталогов для копирования содержится в файле copylist.txt рядом с командным файлом.
:: Знак "-" перед путем каталога отменяет его обработку. Пути каталогов заключены в кавычки.
::
@echo off
setlocal enableextensions enabledelayedexpansion
set df="%~dp0copylist.txt"
for /f "tokens=*" %%A in ('cscript /nologo /e:jscript "%~f0"') do set dir2=%%A
if /i "%dir2%" equ "" (exit /b 0)
rem [проверка на слеш в конце строки, на случай если выбран диск]
if "%dir2:~-1%" equ "\" (set dir2=%dir2:~0,-1%)
chcp 1251 >nul
::-------------------------------------------
for /f "tokens=*" %%b in ('findstr /r /v "^-" %df%') do (
call :dobackup %%b
)
exit /b 0
::
:: Копирование с помощью xcopy
::
::--------------------------------------------
:dobackup
rem [Дополнение целевого пути именем исходного каталога копирования]
rem [т.е. целевой каталог "C:\Backup" становится "C:\Backup\Myfiles"]
chcp 866 >nul
set stdir=%1
set "x=%stdir:~1,-1%.txt"
rem [выделение каталога как имени файла]
for /f "usebackq tokens=*" %%A in ('%x%') do (
set x1=%%~nA
)
set dsdir="%dir2%\%x1%"
echo Source: %stdir%
echo Destination: %dsdir%
pause
xcopy %stdir% %dsdir% /w /v /d /s /i /e /h /r /y
rem xcopy %stdir% %dsdir% /w /i /d /s /e /h /y
rem [Контрольное сообщение - размеры каталогов]
cscript /nologo /e:jscript "%~f0" %stdir% %dsdir%
pause
goto :eof
::--------------------------------------------
*/
//
// Диалог выбора целевого каталога на JScript
//
var iArgs = WScript.Arguments;
if (iArgs.Count()==0)
{
// Вывод диалога выбора каталога
var oShell = new ActiveXObject('Shell.Application');
var oFolder = oShell.BrowseForFolder(0, "Выбор папки назначения:", 0, "");
if (Number(isNaN(oFolder))==1){WScript.Echo(oFolder.Self.Path);}
WScript.Quit();
}
else
{
// Сравнение размеров каталогов
var oScr = new ActiveXObject('Scripting.FileSystemObject');
var f1 = WScript.Arguments.Item(0);
var f2 = WScript.Arguments.Item(1);
var s1 = oScr.GetFolder(f1).Size;
var s2 = oScr.GetFolder(f2).Size;
WScript.Echo(String(f1 + ': ' + s1 + ' Bytes\n\r' + f2 + ': ' + s2 + ' Bytes\n\rDifference:='+Number(s1-s2).toString() + ' Bytes'));
WScript.Quit();
}
Сгенерировать файл copylist.txt(список каталогов для копирования) можно, например таким скриптом (VBScript):
FolderSelect.vbs
' Создание списка каталогов выделенных в проводнике
Dim oShellApp
Dim oFs, oStream
Dim sFilePath, sFileOut
Set oFs = CreateObject("Scripting.FileSystemObject")
Set oShellApp = CreateObject("Shell.Application")
sFilePath = WScript.ScriptFullName
sFileOut = Left(sFilePath,InStrRev(sFilePath, "\")) & "dirlist.txt"
Set oStream = oFs.OpenTextFile(sFileOut, 8, True, 0)
'------------------------------------------------------------------
For Each oWindow In oShellApp.Windows
If InStr(1, LCase(TypeName(oWindow.Document)), "ishellfolderviewdual") <> 0 Then
For Each oItem In oWindow.Document.SelectedItems
If oItem.IsFolder Then
oStream.WriteLine """" & oItem.Path & """"
End If
Next
End If
Next
'------------------------------------------------------------------
oStream.Close()
MsgBox sFileOut, vbSystemModal, "Reply"
Нужно сначала выделить нужные каталоги в Проводнике (можно в разных окнах), после чего запустить скрипт. Чтобы не затрагивать выделенные пункты, ярлык для скрипта нужно предварительно вынести на отдельную панель запуска, например (Win7) - Панель задач - Панели - Создать панель инструментов, указав каталог со скриптом.