PDA

View Full Version : Aiutino per creazione file .bat


aaasss10
28-04-2014, 16:51
Ciao a tutti!

Sono un novellino :bimbo: e mi sto cimentando nella creazione di un file .bat
per automatizzare alcune operazioni su pc.

La mia situazione è la seguente:
Il file .bat che utilizzo è presente in una cartella (es. PIPPO),
all'interno di PIPPO vi è una sottocartella Temp.

Vorrei inserire nel file .bat un comando (o una serie di comandi) che:
-copi il nome di un file .txt (che di volta in volta ha nomi differenti) presente all'interno della sottocartella Temp e
-rinomini (con il nome copiato + "_HSA") un file .mp4 sempre presente nella sottocartella Temp

es.:
se presente in Temp il file PLUTO.txt ottenere il file PLUTO_HSA.mp4


Qualcuno puo' darmi una mano?? :ave:

Grazie a tutti in anticipo per l'attenzione.

Buona serata :D

Tom Joad
29-04-2014, 08:49
Ecco a te:


@echo off
setlocal EnableDelayedExpansion

for /f "delims=" %%G in ('dir /b %~dp0TEMP\*.txt') do (
set _file=%%G
set _fileName=!_file:~0,-4!
move /y %~dp0TEMP\!_file! %~dp0TEMP\!_fileName!_HSA.mp4 >nul
)

aaasss10
29-04-2014, 10:11
Grazie mille Tom Joad!!!
Sapevo di poter contare su di te!!!
Proverò ad inserire il tutto nello script.

Ne approfitto per chiedere ancora una cosa:

Come posso far si che una volta rinominato il file .mp4
lo script mi restituisca la frase:
"File xxxxxxx_HSA.mp4 creato e salvato nella catella Temp"

Ancora mille grazie!!! :cincin:

Tom Joad
29-04-2014, 10:40
Grazie mille Tom Joad!!!
Sapevo di poter contare su di te!!!
Proverò ad inserire il tutto nello script.

Ne approfitto per chiedere ancora una cosa:

Come posso far si che una volta rinominato il file .mp4
lo script mi restituisca la frase:
"File xxxxxxx_HSA.mp4 creato e salvato nella catella Temp"

Ancora mille grazie!!! :cincin:

Eccoti il codice. Rinomina tutti i file .txt nella cartella temp in NomeFile_HSA.mp4


@echo off
setlocal EnableDelayedExpansion

for /f "delims=" %%G in ('dir /b %~dp0TEMP\*.txt') do (
set _file=%%G
set _fileName=!_file:~0,-4!
move /y %~dp0TEMP\!_file! %~dp0TEMP\!_fileName!_HSA.mp4 >nul
echo File !_fileName!_HSA.mp4 creato e salvato nella cartella %~dp0TEMP
)
echo Operazione completata. Premere un tasto per uscuire.
pause >nul
exit

aaasss10
29-04-2014, 11:05
Aspetta!!! Aspetta!!!

Forse mi sono espresso male nei post precedenti,
io non voglio rinominare un file .txt in NomeFile_HSA.mp4.

La mia situazione è questa:


PIPPO
|
| script.bat
|--Temp
|
| NomeFile.txt
| video.mp4
| video.srt
| video_HSA.mp4

Cartella principale PIPPO contenente:
- script.bat
- sottocartella Temp

Sottocartella Temp contenente:
- NomeFile.txt
- video.mp4
- video.srt
- video_HSA.mp4

Io vorrei che il file video_HSA.mp4 venga rinominato prendendo il nome
dal file NomeFile.txt.
Quindi da video_HSA.mp4 diventi NomeFile_HSA.mp4
(il file NomeFile.txt ha ogni volta un nome differente)

Dopo tutto ciò lo script dovrebbe restituire una riga di testo:
"File NomeFile_HSA.mp4 creato e salvato nella catella Temp"

Grazie ancora per l'attenzione e l'aiuto!!!

Tom Joad
29-04-2014, 11:58
Aspetta!!! Aspetta!!!

Forse mi sono espresso male nei post precedenti,
io non voglio rinominare un file .txt in NomeFile_HSA.mp4.

La mia situazione è questa:


PIPPO
|
| script.bat
|--Temp
|
| NomeFile.txt
| video.mp4
| video.srt
| video_HSA.mp4

Cartella principale PIPPO contenente:
- script.bat
- sottocartella Temp

Sottocartella Temp contenente:
- NomeFile.txt
- video.mp4
- video.srt
- video_HSA.mp4

Io vorrei che il file video_HSA.mp4 venga rinominato prendendo il nome
dal file NomeFile.txt.
Quindi da video_HSA.mp4 diventi NomeFile_HSA.mp4
(il file NomeFile.txt ha ogni volta un nome differente)

Dopo tutto ciò lo script dovrebbe restituire una riga di testo:
"File NomeFile_HSA.mp4 creato e salvato nella catella Temp"

Grazie ancora per l'attenzione e l'aiuto!!!

Sorry, non avevo capito una sega :D


@echo off
setlocal EnableDelayedExpansion
set _tempDir=%~dp0Temp

for /f "delims=" %%G in ('dir /b %_tempDir%\*.txt') do (
set _txtFile=%%G
set _txtFileName=!_txtFile:.txt=!
call :FileRename !_txtFileName!
)

echo Operazione completata. Premere un tasto per uscuire.
pause >nul
exit

:FileRename
for /f "delims=" %%G in ('dir /b %_tempDir%\*.mp4') do (
set _hsaFile=%%G
set _hsaFileName=!_hsaFile:.mp4=!
if "!_hsaFileName:~-4!"=="_HSA" (
move /y %_tempDir%\!_hsaFile! %_tempDir%\%1_HSA.mp4 >nul
echo File %1_HSA.mp4 creato e salvato nella cartella %_tempDir%
echo.
)
)
goto :eof

aaasss10
29-04-2014, 14:38
Grazie mille!!
Ho creato un .bat ad hoc per provarlo e funziona tutto!!
Ho dovuto però modificarlo così:
@echo off
setlocal EnableDelayedExpansion

cd Temp
for /f "delims=" %%G in ('dir /b *.txt') do (
set _txtFile=%%G
set _txtFileName=!_txtFile:.txt=!
call :FileRename !_txtFileName!
)

echo Operazione completata. Premere un tasto per uscuire.
pause >nul
exit

:FileRename
for /f "delims=" %%G in ('dir /b *.mp4') do (
set _hsaFile=%%G
set _hsaFileName=!_hsaFile:.mp4=!
if "!_hsaFileName:~-4!"=="_HSA" (
move /y !_hsaFile! %1_HSA.mp4 >nul
echo File %1_HSA.mp4 creato e salvato nella cartella Temp
echo.
)
)
goto :eof
altrimenti mi restituiva l'errore:
Impossibile trovare il percorso specificato.

Ora provo ad integrarlo nel .bat originale complessivo

Tom Joad
29-04-2014, 14:41
Grazie mille!!
Ho creato un .bat ad hoc per provarlo e funziona tutto!!
Ho dovuto però modificarlo così:
@echo off
setlocal EnableDelayedExpansion

cd Temp
for /f "delims=" %%G in ('dir /b *.txt') do (
set _txtFile=%%G
set _txtFileName=!_txtFile:.txt=!
call :FileRename !_txtFileName!
)

echo Operazione completata. Premere un tasto per uscuire.
pause >nul
exit

:FileRename
for /f "delims=" %%G in ('dir /b *.mp4') do (
set _hsaFile=%%G
set _hsaFileName=!_hsaFile:.mp4=!
if "!_hsaFileName:~-4!"=="_HSA" (
move /y !_hsaFile! %1_HSA.mp4 >nul
echo File %1_HSA.mp4 creato e salvato nella cartella Temp
echo.
)
)
goto :eof
altrimenti mi restituiva l'errore:
Impossibile trovare il percorso specificato.

Ora provo ad integrarlo nel .bat originale complessivo

Ho fatto delle prove, a me funziona alla perfezione. Credo dipenda dal fatto che l'estensione del tuo script sia .bat anziché .cmd. Comunque se funziona meglio così.

aaasss10
29-04-2014, 14:54
Ho fatto delle prove, a me funziona alla perfezione. Credo dipenda dal fatto che l'estensione del tuo script sia .bat anziché .cmd. Comunque se funziona meglio così.
Ah ecco perchè.
Comunque ho integrato tutto nello script e sto testando.
Ti tengo aggiornato...

Se tutto fila liscio ti invio lo script così mi dai un tuo parere :D

Ri-Ri-Ri grazie!!!

Tom Joad
29-04-2014, 15:05
Ah ecco perchè.
Comunque ho integrato tutto nello script e sto testando.
Ti tengo aggiornato...

Se tutto fila liscio ti invio lo script così mi dai un tuo parere :D

Ri-Ri-Ri grazie!!!

Ok, se mi mandi tutto lo script forse capisco meglio. Di video, sottotitoli etc. so ben poco, se non che mi serve VLC per aprirli... :D

Dimmi se sbaglio, ma i file nella cartella temporanea sono tutti relativi a un singolo film, giusto?

NomeFile.txt
video.mp4
video.srt
video_HSA.mp4

Se è così si potrebbe modificare lo script in modo da processare più film in una sola volta.

Ad esempio la struttura della directory potrebbe essere la seguente:


PIPPO
|
| script.cmd
|--Temp
|--Film1
| NomeFile.txt
| video.mp4
| video.srt
| video_HSA.mp4
|--Film2
NomeFile.txt
video.mp4
video.srt
video_HSA.mp4

aaasss10
29-04-2014, 15:41
Azz..
..piccolo intoppo:

Utilizzando un file .txt chiamato The 100 1x01.txt
lo script rinomina il file video_HSA.mp4 in The_HSA.mp4

Sembra che la parte " 100 1x01" del nome del file .txt venga ignorata...

:cry:

Tom Joad
29-04-2014, 15:46
Azz..
..piccolo intoppo:

Utilizzando un file .txt chiamato The 100 1x01.txt
lo script rinomina il file video_HSA.mp4 in The_HSA.mp4

Sembra che la parte " 100 1x01" del nome del file .txt venga ignorata...

:cry:

non mi piace dover gestire file o cartelle con spazi nei nomi o nei percorsi per vari motivi. se vuoi lo sistemo per gestire gli spazi, ma sarebbe preferibile rinominare i file (sempre tramite script) con degli altri caratteri (ad esempio _ ). dimmi quale opzione preferisci e ti modifico di conseguenza lo script.

aaasss10
29-04-2014, 16:00
non mi piace dover gestire file o cartelle con spazi nei nomi o nei percorsi per vari motivi. se vuoi lo sistemo per gestire gli spazi, ma sarebbe preferibile rinominare i file (sempre tramite script) con degli altri caratteri (ad esempio _ ). dimmi quale opzione preferisci e ti modifico di conseguenza lo script.
...se si potessero gestire anche gli spazi sarebbe meglio... :rolleyes:
(così lo script sarà più immediato per gli utilizzatori)

Questo è un .bat che comprende solo la parte finale dello script:
@ECHO OFF
::05-RINOMINA FILE OTTENUTO
setlocal EnableDelayedExpansion

cd Temp
for /f "delims=" %%G in ('dir /b *.txt') do (
set _txtFile=%%G
set _txtFileName=!_txtFile:.txt=!
call :FileRENAME !_txtFileName!
)
GOTO DelORIG

:FileRENAME
for /f "delims=" %%G in ('dir /b *.mp4') do (
set _hsaFile=%%G
set _hsaFileName=!_hsaFile:.mp4=!
if "!_hsaFileName:~-4!"=="_HSA" (
move /y !_hsaFile! %1_HSA.mp4 >nul
)
)

::06-BACKUP FILE ORIGINALI
:DelORIG
SET /P A=Eliminare i file di origine? (.mp4 e .srt) [S/N]
ECHO.
IF /I "%A%"=="S" (
cd Temp
del video.mp4
del video.srt
del video.ssa
del video.mkv
del *.txt
CLS
ECHO ====================================================================
ECHO === Mp4 HardSubber ===
ECHO == ==
ECHO === v.14.04.29 by aaasss10 ===
ECHO ====================================================================
ECHO.
ECHO - File di origine eliminati
ECHO.
ECHO - File %1_HSA.mp4 con HardSub integrati
ECHO creato e salvato nella catella Temp
ECHO.
ECHO.
GOTO END
)
IF /I "%A%"=="N" (
cd Temp
del *.txt
del video.ssa
del video.mkv
md "File originali"
ren video.mp4 "video_originale.mp4"
ren video.srt "video_originale.srt"
move video_originale.mp4 "%~dp0Temp\File originali"
move video_originale.srt "%~dp0Temp\File originali"
CLS
ECHO ====================================================================
ECHO === Mp4 HardSubber ===
ECHO == ==
ECHO === v.14.04.29 by aaasss10 ===
ECHO ====================================================================
ECHO.
ECHO - File di origine spostati nella cartella File originali
ECHO.
ECHO - File %1_HSA.mp4 con HardSub integrati
ECHO creato e salvato nella catella Temp
ECHO.
ECHO.
GOTO END
)
ELSE (
CLS
SET A=
GOTO DelORIG
)

::FINALE
:END
ECHO ====================================================================
ECHO === ===
ECHO == OPERAZIONE COMPLETATA. PREMERE UN TASTO PER USCIRE. ==
ECHO === ===
ECHO ====================================================================
pause >nul
exit
..potresti modificare il codice direttamente qui??

A quanti RI sono arrivato con i Ri-Grazie??? :D

Tom Joad
29-04-2014, 17:32
ATTENZIONE: Quando scrivi una funzione, metti sempre goto :eof alla fine

Poi fammi capire una cosa... i nomi dei file sono sempre gli stessi (video.mp4, video.mkv etc.)?

Altra cosa... in DelORIG c'è qualcosa che non va:


if (
...
)
if (
...
)
else (
...
)


detto tra noi... NUN SE PO' VEDE' (e non funziona)

Non ho molto tempo ora per sistemartelo, ti passo un file che genera il mio script per aggiornare le ISO e che utilizza il comando set /p:


@echo off
:_choice
cls
echo Available ISO images:
echo.
echo 1. it_windows_8.1_enterprise_with_update_x64_dvd_4048657.iso
echo.
echo 2. it_windows_server_2012_r2_with_update_x64_dvd_4048504.iso
echo.
set /p _choice=Your selection:
if [%_choice%]==[1] set _isoFile=it_windows_8.1_enterprise_with_update_x64_dvd_4048657.iso
if [%_choice%]==[2] set _isoFile=it_windows_server_2012_r2_with_update_x64_dvd_4048504.iso
if not defined _isoFile (
goto _choice
) else (
goto _confirmation
)

:_confirmation
echo.
echo Selected file: %_isoFile%
echo.
set /p _confirmation=Do you want to continue? [Y,N]
if /i not [%_confirmation%]==[y] (
set _choice=
set _isoFile=
goto _choice
)


Infine il codice che ti serve, testato e funzionante anche se i nomi file contengono spazi.

@ECHO OFF
::05-RINOMINA FILE OTTENUTO
setlocal EnableDelayedExpansion

cd Temp
for /f "delims=" %%G in ('dir /b *.txt') do (
set "_txtFile=%%G"
set "_txtFileName=!_txtFile:.txt=!"
call :FileRENAME
)
call :DelORIG

:FileRENAME
for /f "delims=" %%G in ('dir /b *.mp4') do (
set "_hsaFile=%%G"
set "_hsaFileName=!_hsaFile:.mp4=!"
if "!_hsaFileName:~-4!"=="_HSA" (
move /y "!_hsaFile!" "!_txtFileName!_HSA.mp4" >nul
)
)
goto :eof

Tom Joad
29-04-2014, 17:47
Ecco, così dovrebbe fare quello che vuoi:


@ECHO OFF
::05-RINOMINA FILE OTTENUTO
setlocal EnableDelayedExpansion

cd Temp
for /f "delims=" %%G in ('dir /b *.txt') do (
set "_txtFile=%%G"
set "_txtFileName=!_txtFile:.txt=!"
call :FileRENAME
)
call :DelORIG

:FileRENAME
for /f "delims=" %%G in ('dir /b *.mp4') do (
set "_hsaFile=%%G"
set "_hsaFileName=!_hsaFile:.mp4=!"
if "!_hsaFileName:~-4!"=="_HSA" (
move /y "!_hsaFile!" "!_txtFileName!_HSA.mp4" >nul
)
)
goto :eof

::06-BACKUP FILE ORIGINALI
:DelORIG
SET /P A=Eliminare i file di origine? (.mp4 e .srt) [S/N]
ECHO.
IF /I "%A%"=="S" (
set _choice=Y
cd Temp
del video.mp4
del video.srt
del video.ssa
del video.mkv
del *.txt
CLS
ECHO ====================================================================
ECHO === Mp4 HardSubber ===
ECHO == ==
ECHO === v.14.04.29 by aaasss10 ===
ECHO ====================================================================
ECHO.
ECHO - File di origine eliminati
ECHO.
ECHO - File !_txtFileName!_HSA.mp4 con HardSub integrati
ECHO creato e salvato nella catella Temp
ECHO.
ECHO.
GOTO END
)
IF /I "%A%"=="N" (
set _choice=N
cd Temp
del *.txt
del video.ssa
del video.mkv
md "File originali"
ren video.mp4 "video_originale.mp4"
ren video.srt "video_originale.srt"
move video_originale.mp4 "%~dp0Temp\File originali"
move video_originale.srt "%~dp0Temp\File originali"
CLS
ECHO ====================================================================
ECHO === Mp4 HardSubber ===
ECHO == ==
ECHO === v.14.04.29 by aaasss10 ===
ECHO ====================================================================
ECHO.
ECHO - File di origine spostati nella cartella File originali
ECHO.
ECHO - File %1_HSA.mp4 con HardSub integrati
ECHO creato e salvato nella catella Temp
ECHO.
ECHO.
GOTO END
)
if not defined _choice (
CLS
SET A=
GOTO DelORIG
)
goto :eof

::FINALE
:END
ECHO ====================================================================
ECHO === ===
ECHO == OPERAZIONE COMPLETATA. PREMERE UN TASTO PER USCIRE. ==
ECHO === ===
ECHO ====================================================================
pause >nul
exit
pause

aaasss10
29-04-2014, 20:46
ATTENZIONE: Quando scrivi una funzione, metti sempre goto :eof alla fine
Ok, ma a cosa serve? eof = end of file?

Poi fammi capire una cosa... i nomi dei file sono sempre gli stessi (video.mp4, video.mkv etc.)?
Alla fine della creazione del file mp4 sottotitolato (video_HSA.mp4) nella catella Temp sono sempre presenti i file:
video.mp4
video.srt
video.ssa
video.mkv
video_HSA.mp4
ed in ultimo il file .txt che di volta in volta cambia nome.

Altra cosa... in DelORIG c'è qualcosa che non va:


if (
...
)
if (
...
)
else (
...
)


detto tra noi... NUN SE PO' VEDE' (e non funziona)
Hai ragione, anche io presumevo dovesse essere IF -> THEN -> ELSE
ma QUI (http://comandi-dos-e-altro.jimdo.com/i-comandi-dos/il-file-batch/) verso metà pagina c'è questo esempio, io ho preso spunto da lì e funziona....

Non ho molto tempo ora per sistemartelo...
Vai tranquillo hai già fatto moltissimo.
Ora inserisco le tue correzioni e faccio un po' di prove.

Ancora Grazie per il tempo che hai perso per me!!

..e ti tengo aggiornato ;)

Tom Joad
29-04-2014, 21:08
A tutto il resto ti rispondo domani, per ora ti chiedo solo: da dove ottieni il file .txt?

Per oggi ti lascio due consigli: un sito molto interessante da consultare come manuale è SS64.com, nella sezione CMD. Per trovare risposte invece è molto utile stackoverflow.com.

aaasss10
29-04-2014, 21:24
A tutto il resto ti rispondo domani, per ora ti chiedo solo: da dove ottieni il file .txt?
Per il funzionamento dello script bisogna inserire i file .mp4 ed .srt nella cartella Temp.
Questi file possono avere qualsiasi nome purchè uguale tra loro.
Ora per far si che i comandi dati ai vari sw di conversione funzionino sempre,
all'inizio dello script ho inserito:
copy *.srt *.txt
ren *.srt video.srt
ren *.mp4 video.mp4
in modo che i file da elaborare siano sempre video.mp4 e video.srt
e per non dimenticare il nome originale di questi file ho creato il file .txt

Ti mando via MP lo script completo appena testato e funzionante!!!
(uso MP non per tenerlo segreto ma solo per non condividere il tutto
fino a quando non sono stra sicuro del corretto funzionamento)

Per oggi ti lascio due consigli: un sito molto interessante da consultare come manuale è SS64.com, nella sezione CMD. Per trovare risposte invece è molto utile stackoverflow.com.
Grazie e buona serata!!!