2012-11-11 11 views
6

Mam skrypt wsadowy, który tworzy folder o nazwie Nowy_Folder oraz kilka podkatalogów i plików wewnątrz. Obecnie, jeśli potrzebuję utworzyć wiele New_Folders, muszę zmienić nazwę każdego New_Folder utworzonego przez wsad, zanim będę mógł go ponownie uruchomić i utworzyć nowy. Chciałbym mieć sprawdzanie wsadowe i sprawdzić, czy istnieje już Nowy_Folder, a jeśli tak, to zwiększyć Nowy_Folder o liczbę. Tak więc będę miał New_Folder, New_Folder1, New_Folder2 i tak dalej.Jak zwiększyć nazwę folderu za pomocą wsadowego systemu Windows?

Jak miałbym to zrobić? Rozwiązania, które widziałem do inkrementacji rzeczy w skryptach wsadowych, nie wydają się odnosić do mojej sytuacji i nie wiem nic o skryptach wsadowych wykraczających poza to, co skopiowałem/wkleiłem dla własnego kodu.

Odpowiedz

6

Oto rozwiązanie, które zawsze będzie działać, nawet jeśli istnieją luki w liczbach. Numer folderu będzie zawsze o 1 większy od aktualnej liczby maksymalnej.

@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

To się udało! Dzięki wielkie! –

+0

działa jak urok. Dzięki! –

3

z tym, że będziesz mógł policzyć liczbę wystąpień "New_Folder *" i utworzyć z kolejnym numerem.

@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% 

Należy pamiętać, że najlepszym sposobem byłoby znaleźć największa liczba na koniec New_Folder, ale Windows Batch jest bardzo ograniczające, a ja jestem facetem Linux!

EDIT: Po około jednej godzinie googlowania i testowania:

@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 

Uwaga, linia poleceń powrócić mi błąd „Składnia polecenia jest niepoprawna”. ale wszystko działa, więc pozwolę ci znaleźć powód ... Nowy folder jest tworzony niezależnie od kolejności katalogów lub jeśli zaczyna się od 1 lub nie :) Mam nadzieję, że Ci się spodoba!

+0

Zgadzam się z Twoim ostatnim zdaniem. Istniejące rozwiązanie może się nie udać, jeśli istnieją luki w numeracji. – dbenham

+0

Oto, zobacz aktualizację! –

+0

Dziękuję bardzo! Skończyłem z rozwiązaniem dbenham, ponieważ kod był bardziej zwięzły, ale doceniam wszystkie komentarze, które włożyłeś w swoje: jak powiedziałem, nigdy wcześniej nie używałem skryptów wsadowych, więc miło jest widzieć logikę, która za tym stoi ! –

2

To rozwiązanie znaleźć nazwę największe ponumerowane i stworzyć następny do niego:

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

EDIT: Poprzednie rozwiązanie nie poprawnie dostać ostatnią folderu policzone, ale obok nich jest popraw:

@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

To nie zadziała, jeśli istnieje już 10, ponieważ sortowanie x10 przed x9. – dbenham

+0

Ups! Masz rację, Dave! Naprawiłem to ... – Aacini

Powiązane problemy