Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Ciclo batch per suddvisione file per quantità in cartelle

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 batch per suddvisione file per quantità in cartelle

Postdi Dylan666 » 11/05/14 23:52

Buongiorno a tutti, ho una cartella (chiamiamola TestFolder) con dentro molti file di testo.
Avrei bisogno di un batch per dividerli in sottocartelle numerate ciascuna contenente diciamo 100 file.
Ho trovato questo link che va molto vicino alla mia esigenza:
http://stackoverflow.com/questions/9123 ... -to-folder

Purtroppo mi sono "incartato" dovendo fare io 2 cicili, uno con una variabile contatore che controlli a che numero di file sia arrrivato (cioè che conti fino a 100) e l'altro che crei le cartelle ogni volta che una si sia riempita con 100 file.

Mi potreste dare una mano?

Grazie
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Sponsor
 

Postdi Dylan666 » 12/05/14 00:19

Sto provando questo codice ma sembra che con il SET la varibile non aumenti mai.
Dove sbaglio
Codice: Seleziona tutto
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
echo on
set DataMax=5
set DataLoc=TestFolder
set FileCount=0
set DirCount=0
:MakeDir
set /A DirCount+=1
MKDIR %DataLoc%\%DirCount%

FOR /F %%a in ('DIR /B %DataLoc%\*.txt') do (
if %FileCount% LEQ %DataMax% (MOVE %DataLoc%\%%a %DataLoc%\%DirCount%) else (GOTO MakeDir)
set /A FileCount+=1
)
pause
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 12/05/14 10:54

MOLTO a occhio (non ho Windows sotto mano) direi che set FileCount=0 va messo dopo :MakeDir.

HTH.

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

Postdi infinito1971 » 12/05/14 11:24

Ciao a tutti,
anch'io come ale, al momento, non ho la possibilità di testare il codice ma penso che il problema possa dipendere dal fatto che le inizializzazioni delle variabili numeriche siano state fatte utilizzando il comando set ma omettendo: /A
Prova e facci sapere! ;)

Un saluto,
infinito1971
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 531
Iscritto il: 01/08/02 21:22
Località: Napoli

Postdi Dylan666 » 12/05/14 11:33

Proprio in un vostro provvidenziale intervento speravo! :) :) :)
Dunque, spostare il set prima del :MakeDir non ha sortito effetto, mettendo il parametro /A (con le righe nella posizione riportata nel mio secondo intervento) l'output mi dice:
Codice: Seleziona tutto
C:\Users\pippo\Desktop\TestDatch>FOR /F %a in ('DIR /B 0\*.txt') do (
if 0 LEQ 5 (MOVE 0\%a 0\1 )  else (GOTO MakeDir )
 set /A FileCount+=1
)
File non trovato


Suppongo che abbia toppato o con le virgolette per le variabili o con la doppia percentuale di "a".
Inoltre il MKDIR così come è non è valido

Posso avere un ulteriore suggerimento ? :D
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 12/05/14 15:30

Dylan666 ha scritto:spostare il set prima del :MakeDir non ha sortito effetto
Prima?

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

Postdi Dylan666 » 12/05/14 16:17

archimede ha scritto:
Dylan666 ha scritto:spostare il set prima del :MakeDir non ha sortito effetto
Prima?

Alessandro

è solo un refuso, "spostare il set CHE ERA prima del :MakeDir non ha sortito effetto" :D
Rileggendolo non mi torna nemmeno come senso, cioè la variabile deve partire da 0 e non avere mai più quel valore ma incrementarsi. Quindi se ridichiarassi ogni volta la variabile quando lo script ripass per il :MakeDir si azzererebbe... :roll:
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 12/05/14 21:55

Codice: Seleziona tutto
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
set /A filesPerFolder=2
set DataLoc=C:\test\prova
set /A FileCount=%filesPerFolder%
set DirCount=0

for /F %%f in ('dir /b %DataLoc%\*.txt') do (
  if "!FileCount!" equ "%filesPerFolder%" (
     set /A DirCount=DirCount+1
     mkdir %DataLoc%\!DirCount!
     set /A FileCount=0
  )
  move %DataLoc%\%%f %DataLoc%\!DirCount!\%%f
  set /A FileCount=FileCount+1
)

endlocal
HTH.

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

Postdi Dylan666 » 12/05/14 22:19

Dunque

1) Ha perfettamente ragione archimede, FileCount va DOPO il MakeDir, non so perché ma ero convinto parlasse di DirCount

2) l'inizializzazione della variabile non deve essere fatta con /A, quel parametro si usa solo per cambiarne il valore con una espressione:
http://ss64.com/nt/set.html

3) Su windows 7/8 non si deve usare COUNT=%COUNT% + 1 per incrementare il valore di una variabile ma invece COUNT=!COUNT! + 1
http://batcheero.blogspot.it/2007/06/ho ... nsion.html

4) all'inizio dello script va esplicitato "setlocal ENABLEDELAYEDEXPANSION"

SOno arrivato a questo codice ma NON funzion se nel nome del file ci sono degli spazi.
Che devo cambiare?

Codice: Seleziona tutto
SETLOCAL ENABLEDELAYEDEXPANSION
echo off
set DataMax=5
set DataLoc=TestFolder
set DirCount=0
:MakeDir
set FileCount=0
set /A DirCount=!DirCount! + 1
MKDIR !DataLoc!\!DirCount!
FOR /F %%a in ('DIR /B !DataLoc!\*.txt') do (
if !FileCount! LSS %DataMax% (MOVE !DataLoc!\"%%a" !DataLoc!\!DirCount!) else (GOTO MakeDir)
set /A FileCount=!FileCount! + 1
 echo ContaFile: !FileCount!
 echo Massimo: %DataMax%
 echo Sposta questo: !DataLoc!\%%a
 echo Spostalo qui: !DataLoc!\!DirCount!
 echo ----------------------------------
 pause
)
pause


PS: grazie archimede, hai postato mentre scrivevo e provavo! :)
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 12/05/14 22:41

Dylan666 ha scritto:NON funzion se nel nome del file ci sono degli spazi.
Codice: Seleziona tutto
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
set /A filesPerFolder=2
set DataLoc=C:\test\prova
set /A FileCount=%filesPerFolder%
set DirCount=0

for /f "delims=" %%f in ('dir /b %DataLoc%\*.txt') do (
  if "!FileCount!" equ "%filesPerFolder%" (
     set /A DirCount=DirCount+1
     mkdir %DataLoc%\!DirCount!
     set /A FileCount=0
  )
  move "%DataLoc%\%%f" "%DataLoc%\!DirCount!\%%f"
  set /A FileCount=FileCount+1
)

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

Postdi Dylan666 » 12/05/14 23:12

Grazie, con il tuo ultimo suggerimento l'ho perfezionato:

Codice: Seleziona tutto
SETLOCAL ENABLEDELAYEDEXPANSION
echo off
set DataMax=10
set DataLoc=TestFolder
set DirCount=0
:MakeDir
set FileCount=0
set /A DirCount=!DirCount! + 1
MKDIR !DataLoc!\!DirCount!
FOR /F "delims=" %%a in ('DIR /B !DataLoc!\*.txt') do (
if !FileCount! LSS %DataMax% (MOVE !DataLoc!\"%%a" !DataLoc!\!DirCount!) else (GOTO MakeDir)
set /A FileCount=!FileCount! + 1
REM echo ContaFile: !FileCount!
REM echo Massimo: %DataMax%
REM echo File: "%%a"
REM echo Sposta questo: !DataLoc!\%%a
REM echo Spostalo qui: !DataLoc!\!DirCount!
REM echo ----------------------------------
REM pause
)
pause


Posso chiederti che differenza sostanziali ci sono tra i nostri due script?
Ad esempio come mai nel tuo compare anche enableextensions?
Ho molto da imparare evidentemente... :oops:
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 12/05/14 23:30

Dylan666 ha scritto:Posso chiederti che differenza sostanziali ci sono tra i nostri due script?
In linea di massima detesto i goto (e le maiuscole :P).
Dylan666 ha scritto:come mai nel tuo compare anche enableextensions?
Perché l'ho copiata dal tuo secondo post: in realtà non serve.

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


Torna a Programmazione


Topic correlati a "Ciclo batch per suddvisione file per quantità in cartelle":


Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti