2016-07-15 71 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