I know batch is a old format, and overly complicated versus PowerShell, but I need to use batch to ensure it is compatible with a lot of older Windows Machines.
I am creating a backup script to verify storage availability on the backup drive will be enough to hold the data on the computer drive.
If it does not have enough space, the script needs to find the first backup found and its creation date, leave it, and delete the next date, then check to see if a backup is viable again.
The issue I am having is finding the oldest dated directory and putting it in a variable, then finding the next oldest directory and removing it, then verifying space again.
This is what I have for verification of script:
: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
)
I have been using a number of things to get the directory date, and it seems "impossible" for batch. I need to do this for work and have been stuck on it for a few day. Thanks for the help!
EDIT: Thanks Stephen for answering, that was exactly what I was looking for. For those of you who were wondering what the finished code is, I'll post it here! Thanks again for the help.
@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