Робокопия | Место назначения зеркала, включая исходную родительскую папку

Я пытался собрать скрипт CMD robocopy, чтобы иметь возможность запрашивать у пользователя путь (копировать, вставлять или просто вводить его вручную), но, похоже, я в тупике ...

Вот текущий код, который у меня есть;

@ECHO OFF
SETLOCAL

:Input
SET /P "source=Please enter or paste the location you want backed up and press ^<Enter^>."
IF "%source%"=="" GOTO Error
GOTO :DoTask
:Error
ECHO You did not specify a location to be backed up! Please try again. & goto :Input

::SET source="":: Obsolete for now, since user input is possible.

:DoTask
REM SET YEAR
set YEAR=%date:~6,4%

REM SET MONTH
set MONTH=%date:~3,2%
if %MONTH% LSS 10 set MONTH=%MONTH:~1,2%
if %MONTH% LSS 10 set MONTH=0%MONTH%

REM SET DAY
set DAY=%date:~0,2%
if %DAY% LSS 10 set DAY=%DAY:~1,2%
if %DAY% LSS 10 set DAY=0%DAY%

REM SET HOUR
set HOUR=%time:~0,2%
if %HOUR% LSS 10 set HOUR=%HOUR:~1,2%
if %HOUR% LSS 10 set HOUR=0%HOUR%

REM SET MINUTE
set MINUTE=%time:~3,2%
if %MINUTE% LSS 10 set MINUTE=%MINUTE:~1,2%
if %MINUTE% LSS 10 set MINUTE=0%MINUTE%

REM SET SECOND
set SECOND=%time:~6,2%
if %SECOND% LSS 10 set SECOND=%SECOND:~1,2%
if %SECOND% LSS 10 set SECOND=0%SECOND%

SET destination="Backups"\%date%
SET logdir="Backups\Logs"\%date%
SET log="Backups\Logs"\%date%\%HOUR%_%MINUTE%_%SECOND%.log

mkdir "%logdir%" 2>NUL

SET copyoptions=/COPYALL /E /ZB /SEC /MIR
:: /COPYALL :: COPY ALL file info.
:: /E       :: Copy Subfolders, including Empty Subfolders.
:: /ZB      :: Use restartable mode; if access denied use Backup mode.
:: /SEC     :: Copy files with SECurity.
:: /MIR     :: MIRror a directory tree.

SET logoptions=/R:0 /W:0 /LOG:%log% /TS /NP /V /ETA /TIMFIX /SECFIX /TEE
:: /R:n:: Number of Retries.
:: /W:n:: Wait time between retries.
:: /LOG:: Output log file.
:: /TS :: Include Source file Time Stamps in the output.
:: /NP :: No Progress - don’t display % copied.
:: /V  :: Produce Verbose output log, showing skipped files.
:: /ETA:: Show Estimated Time of Arrival of copied files.
:: /TIMFIX :: FIX file TIMes on all files, even skipped files.
:: /SECFIX :: FIX file SECurity on all files, even skipped files.
:: /TEE:: Output to console window, as well as the log file.
:: /NFL:: No file logging.
:: /NDL:: No dir logging.

ROBOCOPY %source% %destination% %copyoptions% %logoptions%

:End

Если это слишком долго, отредактируйте это сообщение и просто сделайте ссылку на него: http://pastebin.com/Np8wBF5b < / а>

Итак, в основном моя проблема с вышеизложенным заключается в следующем:

Если я попытаюсь войти в путь:

C:\Users\Public\Pictures\Sample Pictures

Я получаю сообщение об ошибке:

ERROR: Invalid Parameter #3 : "Backups\2013/10/22"
Source: C:\Users\Public\Pictures\Sample\
Destination: G:\Pictures

Обратите внимание, как адресат в первой строке ошибки имеет косую черту вместо обратной? Но что я нахожу разрывом, так это пространство между «Образцом» и «Картинками».

Потому что, если я использую одно слово, оно работает отлично, но подводит меня ко второй проблеме;

Source: C:\Users\User\Pictures\BlackBerry\
Destination: G:\Backups\2013\10\22\

Источник правильный, однако в целевой папке он не воссоздает папку «Blackberry», а только ее содержимое, и это моя проблема ...

Пользователь может выбрать несколько мест назначения для XCOPY, но все, что произойдет, - это все файлы сгруппированы вместе, без структуры папок и т. Д.

Моя голова взорвана от попыток во всем этом разобраться, поэтому я ДЕЙСТВИТЕЛЬНО надеюсь, что такая добрая душа сможет мне в этом помочь! :)


person Deadmano    schedule 22.10.2013    source источник


Ответы (1)


Заключите% source% в кавычки там или там, где он установлен.

Robocopy "%source%" ...

Изменить: дополнительный код после дальнейших комментариев

Измените эту строку, как показано ниже: SET destination="Backups"\%date%

for %%a in ("%source%") do SET destination="Backups\%date%\%%~nxa"

Первые четыре строки этого кода предоставят вам надежные переменные YY DD MM YYYY HH Min Sec в XP Pro и выше. Запустите командный файл ниже, чтобы увидеть переменные, и вы тоже можете их изменить.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
person foxidrive    schedule 22.10.2013
comment
Молодец, спасибо !! :) Тем не менее, у меня все еще проблема с тем, что родительская папка не включается, это единственное, что меня сейчас беспокоит. :/ Например; если вы хотите скопировать папку Blackberry, она будет копировать только файлы внутри указанной папки, а не фактически помещать папку Blackberry в папку резервных копий ... Вы знаете какой-либо способ решить эту проблему? :) - person Deadmano; 23.10.2013
comment
Спасибо за ваш ответ, обязательно добавлю это, однако это не решает мою проблему с копированием Blackberry в папку Backups вместо файлов внутри папки Blackberry, верно? - person Deadmano; 23.10.2013
comment
Спасибо тебе большое, дружище, ты сделал мой день !! :) Работает ОТЛИЧНО, никаких проблем !! :) Теперь я хотел бы еще немного проверить ваши знания, хахаха, пока я не смогу преобразовать все это в сценарий VB, знаете ли вы, как я могу получить приглашение, когда оно запускается, с надписью Enter 1 для варианта 1 (который будет предполагать, что сценарий запущен из папки, для которой необходимо создать резервную копию) или 2) который попросит вас указать папку (как я уже сделал)? - person Deadmano; 23.10.2013