Tworzenie folderu numerowanego, jeśli istnieje już taki plik o tej samej nazwie, przy użyciu pliku wsadowego

0

Obecnie piszę plik wsadowy systemu Windows, który musi sprawdzić, czy istnieje folder z bieżącą nazwą komputera. Jeśli nie, zapisuje folder z nazwą, ale jeśli już tam jest, dodaje na końcu liczbę, aby na końcu mieć folder zawierający takie nazwy folderów

G:\logs\computer-1
G:\logs\computer-2
G:\logs\computer-3
G:\logs\...

do tej pory próbowałem użyć tego fragmentu kodu

set usb=G:
SET logdir="%usb%\logs\%computername%"
FOR /L %%F IN (1,1,25) DO (
IF NOT EXIST "%usb%\logs\%computername%-%%F" (
md "%usb%\logs\%computername%-%%F"
SET logdir=%usb%\logs\%computername%-%%F)
goto :eof
)
ECHO %logdir%

ale wszystko, co udało mi się zrobić, to wyjść z pętli, a nie coś, co chcę zrobić.

Flaver-D
źródło

Odpowiedzi:

1
setlocal

set dir=G:\logs\%computername%

set n=0
md "%dir%"||call :a %n%

rem rest of your script    

exit

rem the a label is set after the exit function to prevent it from
rem running in the actual script when it's not required.

:a
set /a n+=1
md "%dir%-%n%"||goto a
exit /b

Ten skrypt utworzy ponumerowane foldery w opisany sposób.

Wsadowo, składnia dla setto set "foo=bar". Cudzysłowy są konieczne, gdy zmienne zawierają znaki dzielące składnię, takie jak & lub |. Podczas deklarowania zmiennych spacje nie wymagają cudzysłowów. set foo="bar"ustawia foo na "bar".

Regejok
źródło
0

Opcja 1 - Tworzenie wszystkich folderów jednocześnie

Na podstawie kodu początkowego w pytaniu utworzy folder z rozszerzeniem (od 1 do maks. ), Jeśli nie istnieje jeszcze w jednym wywołaniu:

SET usb=G:

SET logdir="%usb%\logs"

SET max=25

FOR /L %%F IN (1,1,%max%) DO (
    IF NOT EXIST "%logdir%\%computername%-%%F" ( 
    md "%logdir%\%computername%-%%F")
    )

Dawny.

Przykład tworzenia folderów wsadowych jednocześnie

Opcja 2 - Tworzenie folderów przyrostowo

Jako druga opcja poniższe rozwiązanie doda przyrostowe rozszerzenie pliku raz na połączenie (w oparciu o całkowitą liczbę folderów w katalogu). Podobnie ignoruje istniejące foldery:

SET usb=G:

SET logdir="%usb%\logs"

FOR /f %%A IN ('dir /b /ad %logdir%^|find /c /v "" ') DO SET fcount=%%A

SET /a fcount+=1

IF NOT EXIST "%logdir%\%computername%-%%A" (
    MD "%logdir%\%computername%-%fcount%")

Dawny.

Przykład tworzenia folderu wsadowego raz na połączenie

Ostrzeżenia

  • Pierwsze rozwiązanie zawsze spowoduje utworzenie folderów od 1 do max .

  • Drugie rozwiązanie ma tę wadę, że wykorzystuje całkowitą liczbę folderów w katalogu. Tak więc, chociaż będzie produkować foldery o podobnych nazwach z rozszerzeniami numerycznymi, prawdziwie uporządkowane sekwencje bez przerw (tj. -1, -2, -3, -4 ...) wymagają:

    • wszystkie nazwy folderów w katalogu muszą być takie same.
    • wszelkie dodatkowe foldery (np. dodane ręcznie) zachowują tę sekwencję (tzn. jeśli istnieje komputer-6 , następnym ręcznie dodanym folderem musi być komputer-7 ).
Anaksunaman
źródło
Potrzebuję tylko czegoś, co się policzy, aby zapobiec zastąpieniu folderu i wskazać, który folder był pierwszy, a następnie drugi.
Flaver-D
Oba te rozwiązania powinny spełniać Twoje potrzeby.
Anaksunaman