Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Ciclo for e scipt batch per rinominare files

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

Ciclo for e scipt batch per rinominare files

Postdi ! ! |_0|_ ! ! » 01/06/10 21:34

Salve a tutti, sono nuovo nel forum. Ho iniziato da un pò di tempo a interessarmi dei batch poichè essi utilizzano un linguaggio abbastanza facile e non ho bisogno ogni volta di utilizzare un compilatore per testarli. C'è però un qualcosa che non riesco a capire molto bene e che ho saltato numerose volte per non scervellarmici...il ciclo FOR :D ! Ho cercato in internet guide ma alla fine si trovano sempre quasi le stesse cose e non ho trovato ancora una spiegazione esaudiente del funzionamento di esso. Tramite prompt col comando "for /?" spiega diverse cose ma io, sinceramente, ci capisco poco e nulla dato che non vi sono esempi esplicativi. Potrebbe qualcuno darmi delle delucidazioni su di esso? Ho visto anche alcuni batch contententi, oltre a FOR, la parola "token"...:?: :?: A cosa serve?
Oggi ho provato a creare un batch con lo scopo di rinominare dei files di una cartella con un numero progressivo, partendo da 0, ma con scarsi risultati...Ne ho fatti 2 diversi ma il primo non va proprio, il secondo non va neanche :roll: . Eccoli qui:

-Primo script
Codice: Seleziona tutto
@echo off
set cont=0
for %%a in (*.txt) DO (set /a cont=%cont%+1 & ren %%a %cont%.txt)
echo fine
pause


-Secondo script
Codice: Seleziona tutto
@echo off
set cont=0

:main
for %%a in (*.txt) DO (call :rinom)
goto fine

:rinom
set /a cont=%cont%+1
ren %%a %cont%.txt
goto :eof

:fine
echo fine
pause


Spero che possiate aiutarmi, vi ringrazio in anticipo, ciao ! ;)
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Sponsor
 

Postdi archimede » 02/06/10 17:18

Codice: Seleziona tutto
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a cont=0
for %%a in (*.txt) DO (
set /a cont=cont+1
ren %%a !cont!.txt
)
Per quanto riguarda specifiche delucidazioni, in questa discussione ci sono alcuni puntatori che forse potranno esserti utili.

HTH.

Alessandro

PS: e anche questo può servire.
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 02/06/10 20:20

Grazie per la risposta e per i link. Però ho provato a cambiare il batch come hai consigliato ma il prompt mi restituisce "Sintassi del comando errata" e i files non vengono rinominati. Cosa può esserci di sbagliato?
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 03/06/10 10:02

Non ne ho idea. Io ho provato lo script su Windows XP e non mi ha dato problemi: sicuro di aver fatto tutti i cambiamenti necessari?

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 03/06/10 13:57

Ho fatto copia incolla per sicurezza ma non va (anch'io ho xp). Lo posiziono nella cartella contenente i file da rinominare (che si chiamano "Nuovo documento di testo 1;2;3;ecc.txt) avvio il batch ma non succede nulla. Se inserisco alla fine un "pause" vedo che appare per n volte (n = numero dei files) "Sintassi del comando errata". ???
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 03/06/10 14:39

Forse il problema è causato dal fatto che i tuoi files hanno nomi che contengono spazio o altri caratteri "strani".

Non ho un PC per verificare, ma puoi provare
Codice: Seleziona tutto
ren "%%a" !cont!.txt
HTH.

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 03/06/10 16:21

Funziona! Grazie! Un'ultima cosa. Se volessi far in modo che uno script "legga" una determinata riga contenuta in un file di testo e se la memorizzi in una variabile come lo potrei fare? Ad esempio se un file di testo contiene diverse righe e una di esse ha scritto "Opzione6=50" potrei far in modo che lo script cerchi all'interno del file l' "Opzione6" e si salvi il suo valore in una variabile?
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 03/06/10 20:22

Questo mi ha divertito (ma non lo userei per delle cose "serie"):
Codice: Seleziona tutto
@echo off
find "Opzione6=" test.ini | sort /r | date | find "=" > imme#tere.bat
echo set value=%%5> immettere.bat
call imme#tere.bat
del imme?tere.bat > nul
echo Opzione6 = %value%
Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 03/06/10 20:44

Ho provato ma non mi funziona. Mettendo un pause dopo "find "Opzione6=" test.ini | sort /r | date | find "=" > imme#tere.bat" vedo che il file che si crea, ovvero imme#tere.bat, è vuoto.

Ps. Mi potresti spiegare a cosa servono i pipes? E come mai %%5?
Pss. Grazie ancora per i links :) , ho letto quello riguardante l'espansione delle variabili e mi ha chiarito i dubbi sul SETLOCAL ENABLEDELAYEDEXPANSION e sull'uso dei punti esclamativi.
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 04/06/10 08:02

! ! |_0|_ ! ! ha scritto:Mettendo un pause dopo "find "Opzione6=" test.ini | sort /r | date | find "=" > imme#tere.bat" vedo che il file che si crea, ovvero imme#tere.bat, è vuoto.
Hai un file che si chiama test.ini e che contiene la riga che cerchi?

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 04/06/10 13:55

Mha, ho ricreato il batch e ora funziona,sarà perchè il computer è un pò impallato in questi giorni :roll: (ieri con choice mi spuntavano caratteri strani prima dell'esecuzione del comando). Potresti spiegarmi in dettaglio la funzione di ogni riga di comando presente nello script cosicchè la possa applicare ad altri casi? Grazie di tutto !
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 04/06/10 14:09

Prova a eseguire le istruzioni una per una da riga di comando: il meccanismo dovrebbe risultare abbastanza evidente. Se così non fosse scrivi qui quale passaggio non ti è chiaro.

Quanto ad applicarlo in altri casi, valuta con attenzione: si tratta di una soluzione non esattamente "professionale".

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 04/06/10 14:37

Ad esempio nella seconda riga, il Find trova l'opzione6 e la ordina? E come mai ricerca l' "=" ? Come fai a trovare ciò che è dopo l'uguale di opzione6? Ho capito che utilizzi la data ed in essa gli immetti l'opzione6 con il suo valore, ma come fai a prelevarne il valore e impostarlo nella variabile?
Diciamo che ho non pochi dubbi :D
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 04/06/10 15:26

Ma hai provato le istruzioni una alla volta?
Codice: Seleziona tutto
C:\test>find "Opzione6=" test.ini
---------- TEST.INI
Opzione6=50

C:\test>find "Opzione6=" test.ini | sort /r
Opzione6=50
---------- TEST.INI

C:\test>find "Opzione6=" test.ini | sort /r | date
Data corrente: 04/06/2010
Immettere nuova data: (gg/mm/aa) Opzione6=50
Data specificata non valida.
Immettere nuova data: (gg/mm/aa)

C:\test>find "Opzione6=" test.ini | sort /r | date | find "="
Immettere nuova data: (gg/mm/aa) Opzione6=50
Da quanto sopra si evince che la prima istruzione schiaffa nel file imme#tere.bat la stringa Immettere nuova data: (gg/mm/aa) Opzione6=50 (cosa che si poteva capire anche più semplicemente commentando la delete e aprendo i files creati).

Poiché Immettere non è una parola riservata, viene creato un batch con tale nome; con questo trucchetto, l'esecuzione di imme#tere.bat non farà altro che richiamare immettere.bat passandogli dei parametri (eh sì, se non hai Windows in italiano dovrai modificare il codice).
Codice: Seleziona tutto
@echo off
find "Opzione6=" test.ini | sort /r | date | find "=" > imme#tere.bat
echo set value1=%%1> immettere.bat
echo set value2=%%2>> immettere.bat
echo set value3=%%3>> immettere.bat
echo set value4=%%4>> immettere.bat
echo set value5=%%5>> immettere.bat
call imme#tere.bat
rem del imme?tere.bat > nul
echo value1 = %value1%
echo value2 = %value2%
echo value3 = %value3%
echo value4 = %value4%
echo value5 = %value5%
Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi ! ! |_0|_ ! ! » 04/06/10 17:20

Ok mi ci sono scervellato un pò, quindi :

Codice: Seleziona tutto
find "Opzione6=" test.ini | sort /r | date | find "=" > imme#tere.bat

Cerca in test.ini la riga contenente "Opzione6=", fa in modo di mettere Opzione6=[valore] nella prima riga con "sort /r", cerca di impostare questa stringa come data e essa viene scritta in "imme#tere.bat"

Codice: Seleziona tutto
echo set value=%%5> immettere.bat

Scrive in "immettere.bat" la stringa "set value=%5"

Codice: Seleziona tutto
call imme#tere.bat

Chiama imme#tere.bat, il quale dà come comando "Immettere nuova data: (gg/mm/aa) Opzione6=[valore]" che,in realtà, richiama a se il file "Immettere", che contiene "set value=%5",dando come parametri "nuova data: (gg/mm/aa) Opzione6=[valore]", il che significa che %5 assume il valore di [valore] che poi viene stampato a schermo.

Che ingegno per uno script simile !
Una domanda però: quest'ultimo passaggio non è come se desse questo comando:
Codice: Seleziona tutto
set value=%5 nuova data: (gg/mm/aa) Opzione6=[valore]

Allora perchè se io dò lo stesso comando da prompt "value" assume valore "%5 nuova data: (gg/mm/aa) Opzione6=[valore]"?
E c'è un modo per assegnare la stringa che ritorna il primo Find ad una variabile anzichè ad un file (sostituendo mme#tere.bat con %var% mi crea sempre un file)?
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07

Postdi archimede » 04/06/10 17:38

Perché %5 rappresenta il 5° parametro passato a un file batch, da riga di comando non funziona.

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Ciclo for e scipt batch per rinominare files

Postdi ! ! |_0|_ ! ! » 06/06/10 09:28

Ok. Ora mi studio i comandi e i vari parametri dal sito che mi hai dato. Grazie ancora,ciao !
! ! |_0|_ ! !
Utente Junior
 
Post: 28
Iscritto il: 01/06/10 21:07


Torna a Programmazione


Topic correlati a "Ciclo for e scipt batch per rinominare files":


Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti