2012-11-11 11 views
6

Ho uno script batch che crea una cartella denominata New_Folder e alcune sottodirectory e file all'interno. Attualmente, se devo creare più New_Folders, devo rinominare ogni New_Folder creata dal batch prima che possa essere eseguito di nuovo e crearne uno nuovo. Quello che mi piacerebbe fare è avere il controllo batch e vedere se New_Folder esiste già, e in tal caso, per incrementare New_Folder di un numero. Quindi avrei New_Folder, New_Folder1, New_Folder2 e così via.Come si incrementa il nome di una cartella utilizzando il batch di Windows?

Come faccio a fare questo? Le soluzioni che ho visto per incrementare le cose negli script batch non sembrano applicarsi alla mia situazione e non so nulla di script batch oltre a ciò che ho copiato/incollato per il mio codice.

risposta

6

Ecco una soluzione che funziona sempre, anche se ci sono lacune nei numeri. Il numero di cartella sarà sempre 1 maggiore del numero massimo attuale.

@echo off 
setlocal enableDelayedExpansion 
set "baseName=New_Folder" 
set "n=0" 
for /f "delims=" %%F in (
    '2^>nul dir /b /ad "%baseName%*."^|findstr /xri "%baseName%[0-9]*"' 
) do (
    set "name=%%F" 
    set "name=!name:*%baseName%=!" 
    if !name! gtr !n! set "n=!name!" 
) 
set /a n+=1 
md "%baseName%%n%" 
+0

Questo l'ha fatto! Grazie mille! –

+0

funziona come un fascino. Grazie! –

3

con cui è possibile contare il numero di occorrenze di "New_Folder *" e crearne uno con il numero successivo.

@echo off 
set /a count=0 

for /d %%d in (New_Folder*) do (
    set /a count+=1 
) 

set /a count+=1 

mkdir New_Folder%count% 

Nota che il modo migliore sarebbe quella di trovare il maggior numero alla fine del Nuova_cartella, ma Windows Batch è molto limitativa e io sono un ragazzo di Linux!

EDIT: Dopo circa un'ora di googling e test:

@echo off 

setlocal EnableDelayedExpansion 

set max_number=0 

for /d %%d in (New_Folder*) do (
    set current_directory=%%~nxd 

    call:StrLength name_length !current_directory! 
    call:Substring directory_number,!current_directory!,10,!name_length! 

    if !directory_number! gtr !max_number! (
     set max_number=!directory_number! 
    ) 
) 

set /a max_number+=1 

mkdir New_Folder%max_number% 

:Substring 
::Substring(retVal,string,startIndex,length) 
:: extracts the substring from string starting at startIndex for the specified length 
SET string=%2% 
SET startIndex=%3% 
SET length=%4% 

if "%4" == "0" goto :noLength 
CALL SET _substring=%%string:~%startIndex%,%length%%% 
goto :substringResult 
:noLength 
CALL SET _substring=%%string:~%startIndex%%% 
:substringResult 
set "%~1=%_substring%" 
GOTO :EOF 

:StrLength 
::StrLength(retVal,string) 
::returns the length of the string specified in %2 and stores it in %1 
set #=%2% 
set length=0 
:stringLengthLoop 
if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop) 
::echo the string is %length% characters long! 
set "%~1=%length%" 
GOTO :EOF 

nota, la riga di comando mi restituisce un errore "La sintassi del comando non è corretto." ma tutto funziona così ti permetterò di scoprire perché ... La nuova cartella viene creata indipendentemente dall'ordine delle directory o se iniziano da 1 o meno :) Spero ti piaccia!

+0

Sono d'accordo con l'ultima frase. La tua soluzione esistente può fallire se ci sono lacune nella numerazione. – dbenham

+0

Eccolo, guarda l'aggiornamento! –

+0

Grazie mille! Ho finito con la soluzione di dbenham perché il codice era più conciso, ma apprezzo tutti i commenti che hai inserito nella tua: come ho detto, non ho mai usato lo scripting in batch prima, quindi è bello vedere un po 'della logica alla base ! –

2

Questa soluzione trovare il nome più grande numero, e creare il prossimo ad esso:

@echo off 
for /d %%d in (New_Folder*) do set lastFolder=%%d 
set /A nextFolder=%lastFolder:*New_Folder=% + 1 
mkdir New_Folder%nextFolder% 

EDIT: soluzione precedente non correttamente ottiene l'ultima cartella numerata, ma il prossimo è correggere:

@echo off 
setlocal EnableDelayedExpansion 
set lastFolder=0 
for /d %%d in (New_Folder*) do (
    set folder=%%d 
    set folder=!folder:New_Folder=! 
    if not defined folder set folder=0 
    if !folder! gtr !lastFolder! set lastFolder=!folder! 
) 
set /A nextFolder=lastFolder+1 
mkdir New_folder%nextFolder% 
+0

Non funzionerà se ce ne sono già 10 perché x10 ordina prima di x9. – dbenham

+0

Oops! Hai ragione, Dave! L'ho risolto ... – Aacini

Problemi correlati