2016-07-15 3 views
1

Ich weiß Batch ist ein altes Format und übermäßig kompliziert im Vergleich zu PowerShell, aber ich muss Batch verwenden, um sicherzustellen, dass es mit vielen älteren Windows-Maschinen kompatibel ist.Ausgabe eines Verzeichniserstellungsdatums auf eine Variable in BATCH

Ich erstelle ein Backup-Skript, um zu überprüfen, ob die Speicherverfügbarkeit auf dem Backup-Laufwerk ausreicht, um die Daten auf dem Computerlaufwerk zu speichern.

Wenn nicht genügend Speicherplatz vorhanden ist, muss das Skript das erste gefundene Backup und sein Erstellungsdatum finden, es verlassen und das nächste Datum löschen. Überprüfen Sie dann, ob ein Backup wieder realisierbar ist.

Das Problem, das ich habe, ist das älteste datierte Verzeichnis zu finden und es in eine Variable zu setzen, dann das nächstälteste Verzeichnis zu finden und es zu entfernen, dann Speicherplatz erneut zu prüfen. Diese

ist, was ich für die Überprüfung der Skript:

: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 
) 

Ich habe eine Reihe von Dingen, wurde mit dem Verzeichnis Datum zu erhalten, und es scheint, „unmöglich“ für Charge. Ich muss das für die Arbeit tun und bin seit ein paar Tagen dran. Danke für die Hilfe!

EDIT: Dank Stephen für die Beantwortung, das war genau das, was ich gesucht habe. Für diejenigen von euch, die sich gefragt haben, was der fertige Code ist, werde ich es hier posten! Danke nochmal für die Hilfe.

@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

vielleicht sind Sie in einer Art und Weise zu interessieren [Erhalten Sie Ihr Datum unabhängig vom lokalisierten Datumsformat] (http://stackoverflow.com/a/18024049/2152082). – Stephan

Antwort

0

Gemäß Ihrer Beschreibung suchen Sie nach dem ältesten und ältesten Verzeichnis. dir hat einige hilfreiche Optionen (siehe 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% 

Wenn Sie den vollständigen Pfad benötigen, verwenden %%~fa

(Anmerkung: /tc Werke für nur NTFS)

+0

Ja das hat perfekt funktioniert! Ich danke dir sehr. – BChaney

Verwandte Themen