2016-07-15 74 views
1

我知道批處理是舊格式,並且與PowerShell相比過於複雜,但我需要使用批處理來確保它與許多較舊的Windows機器兼容。將目錄創建日期輸出到BATCH中的變量

我正在創建備份腳本來驗證備份驅動器上的存儲可用性是否足以將數據保存在計算機驅動器上。

如果它沒有足夠的空間,腳本需要找到找到的第一個備份和它的創建日期,保留它並刪除下一個日期,然後檢查備份是否可以再次生存。

我遇到的問題是找到最舊的目錄並將其放入一個變量中,然後找到下一個最舊的目錄並將其刪除,然後再次驗證空間。

這就是我對劇本的驗證:

:spaceAvailable 
ECHO Checking disk space availablility... 
::Sets Free variable to available space (approximate) of external drive 
FOR /F "tokens=3" %%a IN ('dir /-c %usb%\ ^| FIND /i "bytes free"') DO SET Free=%%a 
SET Free=%Free:~0,-9% 
IF "%Free%"=="" SET Free=0 
::Sets Used variable to size of Users directory 
FOR /F "tokens=3-4" %%v IN ('dir "C:\Users\" /s ^| FIND /i "file(s)"') DO SET Used=%%v 
SET Used=%Used:~0,-12% 
IF "%Used%"=="" SET Used=0 
::Compares the variables Free and Used 
::If Free is more than Used, the backup will continue 
::if not, system will prompt to free up space 
IF %Free% GTR %Used% (
    ECHO Enough disk space is available 
    goto backUp 
) 
IF %Used% GTR %Free% (
    ::INSERT CODE TO LOCATE SECOND OLDEST DIRECTORY HERE 
    ECHO There is not enough space, press any key to erase %oldDir% 
    PAUSE 
    goto spaceAvailable 
) 

我已經用了一些東西拿到目錄的日期,並批量似乎「不可能」。我需要爲了工作而做這件事,並且一直堅持了幾天。 感謝您的幫助!

編輯: 謝謝斯蒂芬回答,那正是我所期待的。 對於那些想知道完成的代碼是什麼的人,我會在這裏發佈它!再次感謝您的幫助。

@ECHO OFF 

::xCopy for data transfer of all user information to an external drive. 
::Created by Benjamin Chaney 
::Version notes- 
::V1.0 - Initial release 
::V1.1 - Replaced XCOPY commands with updated ROBOCOPY commands 
::V1.2 - Created script to verify date and create a directory of todays date 
:: in YYYY_MM_DD format on backup drive. 
:: Also created checks for administrative rights, outlook being opened 
:: and if the backup drive is plugged in. 
::V1.3 - Fixed bugs where it would give an error giving an invalid destination 
::V1.4 - Enhanced the ROBOCOPY command to be more efficient 
::V1.5 - Created an audio queue when backup is finished. 
::V1.6 - Script checks for if there is enough disk space on the drive before the backup 
::V1.7 - Updated to remove second oldest directory in backup drive if no space is available 
ECHO *********************************************************************** 
ECHO *************************HelpDesk Backup V1.7************************** 
ECHO *********************************************************************** 
ECHO **Welcome to the HelpDesk Backup assistant! This will copy all of the** 
ECHO **important information on your computer into your external Backup ** 
ECHO **Drive. Before you begin, there are a few steps to complete:  ** 
ECHO ** 1. Plug in your external backup drive into your computer   ** 
ECHO ** 2. Be sure the name of your Drive is BACKUP.      ** 
ECHO ** -Click on the File Explorer folder (Yellow folder with a blue ** 
ECHO **  holder, usually next to the start icon)      ** 
ECHO ** -A windows will open, left-click on This PC on the left panel ** 
ECHO ** -You should see a number of folders and drives. Locate your ** 
ECHO **  external drive (usually either D: or E:), and right-click on ** 
ECHO **  the drive for more options, then left-click on Rename.  ** 
ECHO ** -Type in BACKUP and press ENTER        ** 
ECHO ** 3. Please close all programs, documents, and web pages before the ** 
ECHO ** process begins.            ** 
ECHO *********************************************************************** 
ECHO *********************************************************************** 
PAUSE 

:adminTEST 

::Verify script has administrative rights. If not, close out of program. 
echo Checking administrative rights... 

net session >nul 2>&1 
    IF %errorLevel% == 0 (
     ECHO Success: Administrative permissions confirmed. 
    goto outlookTEST 
    ) ELSE (
     ECHO Failure: Please run the program in Administrative mode. 
     PAUSE 
     EXIT 
    ) 

ECHO Verifying programs are closed... 

:outlookTEST 

::Verifies Outlook is closed before backup begins. If it is still open, prompts user to close the program, then re-run the program 
    tasklist /fi "imagename eq OUTLOOK.EXE" |find ":" >nul 
    if errorlevel 1 (
     ECHO Your Outlook is still open, please close out of Outlook and try again. 
     PAUSE 
     GOTO outlookTEST 
    ) 
    goto driveLookup 

:driveLookup 

ECHO Finding HDD labeled "BACKUP" 

::Obtain drive letter for BACKUP (the name of the external drive) 
    FOR /f %%D in ('wmic volume get DriveLetter^, Label ^| find "BACKUP"') DO set usb=%%D 
    IF [%usb%]==[] (
     ECHO BACKUP drive is not plugged into the system! Please connect the drive now and try again. 
     PAUSE 
     GOTO driveLookup 
    ) ELSE ( 
     ECHO Found Backup drive! Located at %usb% 
    ) 

:spaceAvailable 

ECHO Checking disk space availablility... 

::Sets Free variable to available space (approximate) of external drive 
FOR /F "tokens=3" %%a IN ('dir /-c %usb%\ ^| FIND /i "bytes free"') DO SET Free=%%a 
SET Free=%Free:~0,-9% 
IF "%Free%"=="" SET Free=0 

::Sets Used variable to size of Users directory 
FOR /F "tokens=3-4" %%v IN ('dir "C:\Users\" /s ^| FIND /i "file(s)"') DO SET Used=%%v 
SET Used=%Used:~0,-12% 
IF "%Used%"=="" SET Used=0 

::Compares the variables Free and Used 
::If Free is more than Used, the backup will continue 
::if not, system will prompt to free up space 
IF %Free% GTR %Used% (
    ECHO Enough disk space is available 
    goto backUp 
) 
IF %Used% GTR %Free% (
    SET /P c=Would you like us to clear some space[Y/N]? 
) 
IF /I "%c%"=="Y" GOTO removeDirectory 
IF /I "%c%"=="N" GOTO clearSpace 
ECHO Didnt work 
PAUSE 
) 

:removeDirectory 

::Sets variables for oldest and second oldest directory, then removes second 
::oldest directory. 
SET "dir1=" 
SET "dir2=" 

FOR /F "delims=" %%a IN ('dir %usb%\Backup\ /tc /ad /od /b') DO (
    IF defined dir2 goto removeNext 
    IF defined dir1 SET "dir2=%%a" & goto removeNext 
    SET "dir1=%%a" 
) 

:removeNext 

::Removes the second oldest directory in the Backup drive 
ECHO Removing directory "%usb%\Backup\%dir2% 
ECHO Please wait while we clear some space... 
RD /S /Q "%usb%\Backup\%dir2% 
    IF errorlevel 0 (
     GOTO clearSpace 
    ) 

GOTO spaceAvailable 

:clearSpace 

ECHO Please manually remove files in your backup drive (%usb%) 
ECHO to clear up at least %Used%GB of space before backing up! 
PAUSE 
EXIT 

:backUp 

ECHO Starting backup process 

::Sets string "today" with todays date in YYYY_MM_DD format 

    SET today=%Date:~10,4%_%Date:~7,2%_%Date:~4,2% 

::Script to copy all contents out of the c:/users into external drive 

    IF EXIST "%usb%\Backup\%today%" (
     GOTO roboCOPY 
    ) ELSE (
     MKDIR %usb%\Backup\%today% 
     ECHO Created backup folder labeled "%today%" 
    ) 

:roboCOPY 

ECHO *************************************************************************** 
ECHO *************************************************************************** 
ECHO **Your computer is now being backed up. Please wait, this may take a  ** 
ECHO **while depending on how much information needs to be backed up.   ** 
ECHO **Once finished, you should hear the notification sound. Please wait. ** 
ECHO *************************************************************************** 
ECHO *************************************************************************** 
ROBOCOPY C:\Users\ %usb%\Backup\%today%\Users\ /MIR /XA:SH /W:0 /R:1 /REG /XJ /LOG:%usb%\Backup\BackupLog.txt 
ECHO 

ECHO **************************************************************************** 
ECHO **************************************************************************** 
ECHO **Your backup is complete! Your backup is located in %usb%\Backup\%today% ** 
ECHO **You can view the log of your backup at %usb%\Backup\BackupLog.txt.   ** 
ECHO **Thank you for using the Help Desk Backup Assistant. Please contact us ** 
ECHO **if you have any questions at ********** or at *******************  ** 
ECHO **************************************************************************** 
ECHO **************************************************************************** 

PAUSE 
EXIT 
+0

也許你有興趣的方式來[讓你的日期獨立於本地化的日期格式](http://stackoverflow.com/a/18024049/2152082)。 – Stephan

回答

0

根據您的描述,您可以查找最古老,最老的目錄。 dir了一些有用的選項(參見dir /?):

@echo off 
set "dir1=" 
set "dir2=" 
for /f "delims=" %%a in ('dir /tc /ad /od /b') do (
    if defined dir2 goto :finish 
    if defined dir1 set "dir2=%%a" & goto :finish 
    set "dir1=%%a" 
) 
:finish 
echo oldest: %dir1% 
echo oldest but one: %dir2% 

如果您需要完整的路徑,使用%%~fa

(注:/tc作品僅限NTFS)

+0

是的,這是完美的工作!非常感謝。 – BChaney