1

Тема: CMD/BAT: Резервное копирование

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

Поддерживается два типа резервирования:
1) Сжатие в архив с помощью 7-Zip архиватора.
2) Синхронизация с помощью nnBackup программы.

Мне нужна ваша помощь в проверке корректной работы скрипта, а также ваши советы, что еще можно улучшить или добавить в функционал.

2

Re: CMD/BAT: Резервное копирование

…и особо из программ выбирать ничего (платно, не портабельно, слабый функционал или отсутствии автоматического режима).

Cobian Backup?!

3

Re: CMD/BAT: Резервное копирование

Так он и так на компьютерах у меня стоит и нужные данные по расписанию в папки скидывает и сжимает.
А мне надо чтобы, подключил usb hdd и нажал на один и тот же ярлык, и все само собой сделалось на любом компьютере (потом вообще можно автозапуск прикрутить), плюс некоторые файлы в dropbox скинуть и вообще под любые свои капризы настроить можно будет.

4

Re: CMD/BAT: Резервное копирование

atomix
По идее Allway Sync должна подойти, там есть опция "При подключении съемного устройства", есть помимо прочих и DropBox. Пакует, правда, в zip с опциями сжатия, в отличии, скажем, от Toucan.
Из портабл есть ещё всякие Synchronize It!, cpnew32, fds, но это для синхронизации больше.

5 (изменено: Poltergeyst, 2023-09-19 21:20:37)

Re: CMD/BAT: Резервное копирование

Для резервного копирования можно использовать ту или иную, зависящую от конкретного случая, "обертку" для 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) - Панель задач - Панели - Создать панель инструментов, указав каталог со скриптом.