Creazione di una cartella numerata se ne esiste già una con lo stesso nome utilizzando un file batch


0

Attualmente sto scrivendo un file batch di Windows che deve verificare se esiste una cartella con il nome del computer corrente. In caso contrario, scrive la cartella con il nome, ma se è già lì, aggiunge un numero alla fine in modo che alla fine avrei una cartella contenente nomi di cartelle come questa

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

finora, ho provato a usare questo pezzo di codice

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%

ma tutto ciò che riesco a fare è uscire dal ciclo, non qualcosa che voglio fare.

Risposte:


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

Questo script creerà cartelle numerate come descritto.

In batch, la sintassi per setè set "foo=bar". Le virgolette sono necessarie quando le variabili includono caratteri di rottura della sintassi, come & o |. Gli spazi non richiedono virgolette quando si dichiarano le variabili. set foo="bar"imposta foo a "bar".


0

Opzione 1: creazione di tutte le cartelle contemporaneamente

In base al codice iniziale nella tua domanda, questo produrrà una cartella con un'estensione (da 1 a max ) se non esiste già in una chiamata:

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

Ex.

Esempio di creazione di cartelle batch tutte in una volta

Opzione 2 - Creazione di cartelle in modo incrementale

Come seconda opzione, la soluzione seguente aggiungerà un'estensione di file incrementale una volta per chiamata (in base al numero totale di cartelle nella directory). Allo stesso modo, ignora le cartelle esistenti:

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%")

Ex.

Esempio di creazione di cartelle batch una volta per chiamata

Avvertenze

  • La prima soluzione produrrà sempre le cartelle da 1 a max .

  • La seconda soluzione presenta un punto debole in quanto utilizza il conteggio totale delle cartelle in una directory. Quindi, mentre produrrà cartelle con nomi simili con estensioni numeriche, sequenze ordinate senza spazi vuoti (ovvero -1, -2, -3, -4 ...) richiedono:

    • tutti i nomi delle cartelle in una directory devono essere uguali.
    • eventuali cartelle aggiuntive (ad es. quelle aggiunte manualmente) mantengono questa sequenza (cioè se esiste il computer-6 , la successiva cartella aggiunta manualmente deve essere computer-7 ).

Ho solo bisogno di qualcosa che conterà per impedire la sovrascrittura delle cartelle e indicare quale cartella è arrivata prima e poi seconda.
Flaver-D

Entrambe queste soluzioni dovrebbero soddisfare le tue esigenze.
Anaksunaman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.