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 № 1Non controllando la logica del tuo script, ho risolto i seguenti problemi che ho già menzionato il mio commento:
goto :Label
interrompe il contesto di un blocco di codice tra parentesi, il tuofor
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 contenentegoto
e:Label
in una subroutine e chiamalo con ilcall
comando; questo nasconde il contesto del blocco corrente dagoto
.::
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 usarerem
anziché.- Abilitare espansione ritardata e usalo per le variabili
date
,time
eFILENAME
, 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