Batch crea cartelle in base a parte del nome del file e sposta i file in quella cartella

Ho 1,6 milioni (!) Di file PDF in un’unica cartella. I file hanno tutti un nome simile a questo:

LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf LAST_FIRST_7-24-1936 Glasses RX 6-1-11_3.pdf 

Devo creare una cartella basata sulla prima parte del file e quindi spostare quel file e tutti gli altri file con la stessa prima parte del nome del file in quella cartella. In questo caso la cartella si chiamerebbe “LAST_FIRST_7-24-1936”. La cartella sarà sempre nominata come la prima parte del file fino allo spazio.

Mi piacerebbe creare un file batch che lo farà. Con la mia conoscenza di programmazione rudimentale mi sono imbattuto in questo processo logico per fare questo:

 1 Take the first file and name it var1 2 Remove everything after the space in var1 and name it var2 3 Create a folder named var2 4 Move the file var1 into the folder var2 5 If there are more files Go to line 1, otherwise end 

Non so quale sarebbe la syntax corretta per questo.

Ho trovato questo link Ho bisogno di uno script per creare cartelle basate su nomi di file e file di spostamento automatico che ho creato in base a quel collegamento

 pushd D:\Data\Medinfo PDFs for %%F in (*.pdf) do ( 2>nul md "%%~nF" >nul move /y "%%~nF*.*" "%%~nF" ) popd 

Ma non mi permette di creare il nome della cartella solo da una parte del nome del file. Se riesco a capire quella parte penso che funzionerebbe. So che ho bisogno di creare una variabile per il nome della cartella, ma non so come modificare la variabile del nome del file per rimuovere tutto dopo lo spazio. Qualsiasi aiuto sarebbe apprezzato. Non sono contrario a farlo in PowerShell o qualcos’altro finché funziona in modo nativo in Windows Server 2008 R2.

 @ECHO OFF SETLOCAL SET "sourcedir=c:\sourcedir" PUSHD %sourcedir% FOR /f "tokens=1*" %%a IN ( 'dir /b /ad "*_*_*-*-* *.*"' ) DO ( ECHO MD %%a ECHO MOVE "%%a %%b" .\%%a\ ) POPD GOTO :EOF 

Questo dovrebbe portare a termine l’attività richiesta o almeno mostrare le istruzioni richieste.

Se si è soddisfatti dei comandi emessi, impostare sourcedir nella directory root richiesta e rimuovere le due parole chiave echo da triggersre.

Il messaggio “la directory esiste già” generato MD al tentativo di ricreare una directory esistente può essere soppresso aggiungendo 2>nul alla riga MD .

Allo stesso modo, il report che un file è stato spostato può essere soppresso aggiungendo >nul alla riga MOVE .

2>nul sopprime i messaggi di errore (provare a creare una directory esistente è un errore) mentre il messaggio ‘files moved’ è un normale messaggio di output, quindi la differenza.


Addendum: come funziona.

Innanzitutto, PUSHD imposta la directory corrente sulla destinazione.
L’output del comando DIR viene tokenizzato da FOR/F La clausola tokens=1* indica che il primo token (1) è assegnato al metavariable nominato ( %%a ) e implicitamente il secondo token (*) a %%b – semplicemente il successivo alfabeticamente. Token * significa everything after those token numbers explicitly mentioned . Non viene utilizzata delims clausola delims , quindi i delimitatori predefiniti (viene utilizzato il set di SEPARATORS, SPACE ,; TAB .

Il DIR è diretto su una maschera di *_*_*-* *.* , Quindi solo i file corrispondenti a quella maschera – dove * indica any number of any characters – saranno posizionati. Poiché la maschera è "quoted" gli spazi sono inclusi nella maschera. Senza le virgolette, sarebbero specificate due maschere separate. L’opzione /b produce un elenco in forma base, cioè solo nomi, senza intestazioni o riepilogo. L’opzione /ad elimina tutti i nomi di directory che potrebbero aver installato la maschera.

Quindi, per LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf , la LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf dir LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf e FOR/F tokenizza come LAST_FIRST_7-24-1936 su %%a e Diagnostic - Topography 11-18-10_1.pdf su %%b utilizzando lo SPAZIO come delimitatore.

Il nome file può quindi essere ricostruito reinserendo lo spazio tra %%a e %%b . Qualsiasi nome file contenente un separatore deve essere citato per raggruppare i caratteri e segnalare che non sono elementi separati. L’objective della mossa è terminato con \ per specificare “Questo è un nome di directory”.

Il POPD ripristina la directory registrata originale.

Questo mi ha davvero aiutato, e ho fatto una leggera modifica per elaborare le mie fotografie digitali (sono un fotografo) e ho chiamato il file batch FolderAndMove. Ecco il mio codice:

 @ECHO OFF SETLOCAL SET "sourcedir=***PASTE_DIRECTORY_HERE***" PUSHD %sourcedir% FOR /f "tokens=1,2,3,4 delims=_" %%a IN ( 'dir /b /ad "*_*_*_*.*"' ) DO ( MD %%a_%%b 2>nul MOVE "%%a_%%b_%%c_%%d" .\%%a_%%b\ >nul ) POPD GOTO :EOF 

Ecco la semplice descrizione che ho fatto per altri fotografi:

FolderAndMove prende una cartella di file di formato *_*_*_*.* (Come LastName_FirstInitial_Event#_Sequence#.JPG ), crea una singola cartella all’interno della cartella principale selezionata per ciascun prefisso univoco *_* file (nel caso di esempio, LastName_FirstInitial ), e sposta tutti i file seguendo la convenzione *_*_*_*.* nella cartella *_* corrispondente al loro prefisso.

Nota che il formato del file è esatto: le variabili (*) devono essere delimitate (~ segmentate) da caratteri di sottolineatura senza spazi per far funzionare FolderAndMove.