script batch per loop e if istruzione non interagisce correttamente


2

Per scopi di archiviazione, ho una cartella piena di file chiamati note_1.txt, note_3.txt, note_4.txt, ecc Sto scrivendo uno script per trovare il maggior numero Ntra quei file, e rinominare un nuovo note.txtfile note_N+1.txt.

Sto usando un batch per loop per la prima volta e non riesco a farlo funzionare correttamente. Ho provato a sostituirlo %con !ma non sono sicuro di capire come funziona.

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
for /f %%i in ('dir /b note_*.txt') do (
    SET archivename=%%~ni
    SET archivenumber=%archivename:~5%
    if %archivenumber% GTR %maxfile% SET /a maxfile=%archivenumber%+1
)
echo %maxfile%
ENDLOCAL

Antoine - Sei stato un vero amico, quindi ho aggiunto un paio di esempi di seguito per aiutarti a risolvere quel banale compito e ho anche fornito alcuni riferimenti per spiegarlo un po 'meglio. Potrebbe essere utile, ad esempio, se si riecheggiano le variabili all'interno del ciclo in un file di registro. . . echo !archivenumber!>>log.txtper ogni variabile, quindi controlla il log dopo l'esecuzione. Se riecheggi quelle stesse variabili con i %segni anziché il !e guardi sopra il registro, ora vedrai le differenze. Fammi sapere se posso aiutare a chiarire ulteriormente, ma questo dovrebbe essere tutto ciò che c'è da fare.
Pimp Juice IT

Risposte:


1

Ho appena aggiunto le !variabili all'interno del FORciclo per assicurarmi che siano tutte espanse al momento dell'esecuzione all'interno del ciclo per garantire che i nuovi valori impostati vengano letti di conseguenza per aiutare a ottenere il !maxfile!valore finale secondo ogni iterazione del ciclo.

Inoltre, ho aggiunto il CD /D "%%~F0"alla riga sopra l'inizio del FORciclo per assicurarmi che la directory sia cambiata nella directory in cui risiede lo script poiché non stai specificando esplicitamente la directory nel tuo esempio di comando ma ho aggiunto anche uno script di esempio esplicito di seguito.

Script batch (implicito)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
cd /d "%%~F0"
for /f %%i in ('dir /b note_*.txt') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

Script batch (esplicito)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
SET "srcdir=C:\Folder\Path"
for /f %%i in ('dir /b "%srcdir%\note_*.txt"') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

Ulteriori risorse

  • enabledelayedexpansion

    L'espansione ritardata causerà l'espansione delle variabili all'interno di un file batch al momento dell'esecuzione anziché al momento dell'analisi, questa opzione è attivata con il comando SETLOCAL EnableDelayedExpansion.


    Quando è attiva l'espansione ritardata, le variabili possono essere lette immediatamente usando! Nome_variabile! puoi anche ancora leggere e utilizzare% nome_varia% che mostrerà il valore iniziale (espanso all'inizio della riga).

  • Per

    Sostituzioni variabili (FOR /?)

    Inoltre, è stata migliorata la sostituzione dei riferimenti alle variabili FOR. Ora puoi usare la seguente sintassi opzionale:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path namey
    

@Antoine - Vedi Accettare una risposta per assicurarti di capire come funziona per la soluzione che trovi per qualsiasi risposta che ti aiuti a risolvere il tuo problema semplicemente selezionando la piccola casella di controllo grigia nella parte in alto a sinistra della risposta che risolve il tuo problema assumendone una fa e diventa verde per mostrare che è la risposta che hai accettato poiché è così che dovrebbe funzionare; fai una domanda, ottieni risposte e se ottieni una risposta che funziona per le tue esigenze, accetti semplicemente quella risposta.
Pimp Juice IT
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.