Batch file 将目录创建日期批量输出到变量

Batch file 将目录创建日期批量输出到变量,batch-file,Batch File,我知道批处理是一种旧格式,与PowerShell相比过于复杂,但我需要使用批处理来确保它与许多旧的Windows机器兼容 我正在创建备份脚本,以验证备份驱动器上的存储可用性是否足以保存计算机驱动器上的数据 如果没有足够的空间,脚本需要找到找到的第一个备份及其创建日期,将其保留,然后删除下一个日期,然后再次检查备份是否可行 我遇到的问题是找到最旧的日期目录并将其放入变量中,然后找到下一个最旧的目录并将其删除,然后再次验证空间 这是我用来验证脚本的工具: :spaceAvailable EC

我知道批处理是一种旧格式,与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
)
我一直在使用很多东西来获取目录日期,对于批处理来说似乎“不可能”。我为了工作需要这么做,已经坚持了几天了。 谢谢你的帮助

编辑: 谢谢斯蒂芬的回答,这正是我想要的。 对于那些想知道完成的代码是什么的人,我将把它发布在这里!再次感谢你的帮助

@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

根据您的描述,您查找的是最旧和最旧的目录,但只有一个
dir
有一些有用的选项(请参见
dir/?
):

如果需要完整的路径,请使用
%%~fa


(注意:
/tc
仅适用于NTFS)

根据您的描述,您查找的是最旧和最旧的目录,但只有一个
dir
有一些有用的选项(请参见
dir/?
):

如果需要完整的路径,请使用
%%~fa


(注意:
/tc
仅适用于NTFS)

也许您对一种方法感兴趣。也许您对一种方法感兴趣。
@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%