/ / Rinomina cartella (poco) dopo la creazione in un ciclo con nuovi timestamp - File batch - Windows, file batch, cmd

Rinominare la cartella (a breve) dopo la creazione in un ciclo con nuovi timestamp - File batch - windows, batch-file, cmd

Domanda di base:

Come posso prendere una cartella creata di recente (eseguita nello stesso batch), quindi fare cose nella cartella, quindi rinominare la cartella con un timestamp e ripetere con un nuovo file generando un nuovo timestamp?

Schema del mio codice batch e risultati attesi rispetto a quelli effettivi:

Sto creando un file batch che eseguirà i passaggi seguenti per tutti i file in una directory.

Passaggio 1 (funzionante): scorrere il file in una directory ed estrarre i dati, questi dati verranno quindi emessi in una cartella creata che deve essere denominata "output" (che viene creata durante questo passaggio).

Passaggio 2 (funzionante): devo andare in questa cartella "output" e "fare cose" con i dati (ho già uno script che va in questo nuovo percorso file dell '"output" e "fa cose")

Passaggio 3 (non funzionante): rinomina la cartella "output" in "output_TimeStamp" (Qui è dove si trova il mio problema, il mio ciclo prende il timestamp n. 1 della prima cartella creata e cerca di nominare tutte le cartelle timestamp n. 1)

Passaggio 4 (semi-funzionante): torna al passaggio 1 per lavorare sul file successivo (ciclo finché tutti i file non sono finiti nella directory)

Il mio codice (beh almeno uno dei miei tentativi)

::Loop to perform tasks on files in current directory
for /R %%f in (*.mp4) do (

::Extracts data from file and leaves it in a created output folder
start "" /w Sample.exe --clip "%%f" --verbose 2 --outDir output

::This goes in created output folder and does stuff to data
start "" /w C:UsersuserDocumentswinPythonWinPython-64bit-3.4.4.2python-3.4.4.amd64python.exe "%CD%DoStuff.py" "%CD%outputfolderfolder2Do.file"

::This is supposed to rename the folder with a time stamp
rename output output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%



::This is what my research came to, which increments a number in the timestamp but doesnt work
set N=0
set FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%
:loop
set /a N+=1
set FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%
if exist %FILENAME% goto :loop

echo You can safely use this name %FILENAME% to create a new file


)

La mia ricerca

Ho provato numerose cose e utilizzato i collegamenti Come si incrementa il nome di una cartella utilizzando il batch di Windows? e La riga cmd rinomina il file con data e ora.
Penso che dovrebbe essere molto più facile che scrivere questa domanda.

risposte:

0 per risposta № 1

Non controllando la logica del tuo script, ho risolto i seguenti problemi che ho già menzionato il mio commento:

  1. goto :Label interrompe il contesto di un blocco di codice tra parentesi, il tuo for loop costituisce un tale blocco; quindi l'esecuzione continua alle :Label ma in un certo senso non sarebbe più in un blocco. Puoi aggirare il problema posizionando la porzione di codice contenente goto e :Label in una subroutine e chiamalo con il call comando; questo nasconde il contesto del blocco corrente da goto.
  2. :: i commenti potrebbero portare a comportamenti imprevisti quando vengono utilizzati all'interno di cicli o altri blocchi di codice tra parentesi; in realtà costituiscono etichette non valide. Dovresti usare rem anziché.
  3. Abilitare espansione ritardata e usalo per le variabili date, time e FILENAME, perché altrimenti si espandono sempre ai valori presenti quando viene analizzato l'intero ciclo.

Quindi ecco il codice modificato:

setlocal EnableDelayedExpansion

rem // Loop to perform tasks on files in current directory
for /R %%f in (*.mp4) do (

rem // Extracts data from file and leaves it in a created output folder
start "" /w "Sample.exe" --clip "%%f" --verbose 2 --outDir output

rem // This goes in created output folder and does stuff to data
start "" /w "C:UsersuserDocumentswinPythonWinPython-64bit-3.4.4.2python-3.4.4.amd64python.exe" "%CD%DoStuff.py" "%CD%outputfolderfolder2Do.file"

rem // This is supposed to rename the folder with a time stamp
rename "output" "output-!date:~4,2!-!date:~7,2!-!date:~10,4!_at_!time:~0,2!!time:~3,2!"

call :SUB

echo You can safely use this name !FILENAME! to create a new file

)
endlocal
exit /B


:SUB
rem // This is what my research came to, which increments a number in the timestamp but doesnt work
set /a N=0
set "FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%"
:loop
set /a N+=1
set "FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%"
if exist "%FILENAME%" goto :loop
exit /B