2013-10-22 37 views
0

我一直在試圖放在一起的robocopy 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\ 

來源是正確的,但在目標文件夾不重新創建「黑莓」文件夾中,只有其中的內容,那就是我的問題......

對於用戶到達選擇多個目的地XCOPY,但所有這些將發生的是所有的文件聚集在一起,沒有文件夾結構等...

我的頭很滿意,試圖找出這一切,所以我真的很希望這樣靈魂將能夠幫助我與此! :)

回答

1

用引號將%source%括起來,或者在那裏或者它被設置的地方。如下圖所示經過進一步的評論

改變這一行額外的代碼:

Robocopy "%source%" ... 

編輯SET destination="Backups"\%date%

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

前四個這段代碼的行會給你可靠的YY DD MM YYYY HH Min Pro變量在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 
+0

輝煌的伴侶,謝謝! :)但是,我仍然沒有包含父文件夾的問題,這是現在唯一讓我煩惱的事情。 :/ 例如;如果您想複製「Blackberry」文件夾,它只會複製該文件夾內的文件,而不會實際上將「Blackberry」文件夾放入備份文件夾中......您是否知道解決此問題的方法? :) – Deadmano

+1

看到我上面編輯的答案 – foxidrive

+0

謝謝你的回覆,一定會補充說,但是這並不能解決我將「黑莓」複製到備份文件夾而不是「黑莓」文件夾內的文件的問題, 對? – Deadmano