我知道批处理是一种旧格式,与PowerShell相比过于复杂,但我需要使用批处理来确保它与许多旧版Windows机器兼容。
我正在创建一个备份脚本来验证备份驱动器上的存储空间是否足以将数据保存在计算机驱动器上。
如果没有足够的空间,脚本需要找到找到的第一个备份及其创建日期,保留并删除下一个日期,然后检查备份是否可行。
我遇到的问题是找到最旧的日期目录并将其放入变量中,然后找到下一个最旧的目录并将其删除,然后再次验证空间。
这是我验证脚本的原因:
: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
)
我一直在使用许多东西来获取目录日期,而且似乎"不可能"批量。我需要为工作做这件事并且已经坚持了几天。 谢谢您的帮助!
编辑: 感谢Stephen回答,这正是我想要的。 对于那些想知道完成的代码是什么的人,我会在这里发布!再次感谢您的帮助。
@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 :(得分: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)