File batch: consente di modificare i nomi dei file con determinate estensioni in più directory in base al nome della directory e copiare in una directory

Sono tutto nuovo a file e DOS, ma spero che tu possa aiutarti comunque.

Ho bisogno di copiare i file di un tipo di file specifico che sono ora in sottodirectory separati, un tale file per directory (ma altri file con diversi tipi di file). Tutti hanno lo stesso nome, quindi quando si copia in una nuova cartella, l'ultimo file da copiare viene sostituito dal seguente file quando si utilizza il command descritto in questa domanda: Copiare i file con determinate estensioni da più directory in una directory .

Sarebbe ansible prima cambiare i nomi dei file nei nomi della rispettiva directory e quindi utilizzare il command nell'esempio? O ancora meglio, cambiare il nome della nuova copia del file prima di inserirlo nella nuova directory oppure dopo averlo copiato ma prima di copiare il seguente file?

Okay, ecco uno. Potresti voler considerare l'utilizzo di qualcosa di più flessibile di un file batch; un semplice programma C ++ sarebbe stato molto più facile. Il batch non gioca bene con la manipolazione string necessaria per estrarre il nome della directory.

@ECHO OFF SETLOCAL EnableDelayedExpansion SET _destination=%~1 SHIFT SET _source=%~1 SHIFT SET _cmdstring=dir /b /s :LoopGetExt SET _cmdstring=%_cmdstring% "%_source%\*%~1" SHIFT IF NOT "%~1"=="" GOTO LoopGetExt ::End LoopGetExt FOR /F "tokens=*" %%i IN ('%_cmdstring%') DO ( SET _fullpath=%%i SET _splitpath=!_fullpath:\=^ ! SET _filename=%%~ni%%~xi FOR /F "tokens=*" %%j IN ("!_splitpath!") DO ( IF NOT "%%j"=="!_filename!" SET _dirname=%%j ) ECHO "%%i" =^> "%_destination%\!_dirname!_!_filename!" COPY "%%i" "%_destination%\!_dirname!_!_filename!" ) ENDLOCAL 

Al momento nulla è stato codificato: per utilizzarlo, fai questo.

 copyfiles.bat <destination> <source> <ext> [ext] 

per esempio

 copyfiles.bat "C:\Dest" "C:\Source" .txt .xml .csv .log 

EDIT (secondo la richiesta nel primo commento)

 ::copyfiles.bat <destination> <source> <ext> [ext] ::eg ::copyfiles.bat "C:\Dest" "C:\Source" .txt .xml .csv .log @ECHO OFF SETLOCAL EnableDelayedExpansion SET _destination=%~1 SHIFT SET _source=%~1 SHIFT SET _cmdstring=dir /b /s :LoopGetExt SET _cmdstring=%_cmdstring% "%_source%\*%~1" SHIFT IF NOT "%~1"=="" GOTO LoopGetExt ::End LoopGetExt FOR /F "tokens=*" %%i IN ('%_cmdstring%') DO ( SET _fullpath=%%i SET _splitpath=!_fullpath:\=^ ! SET _filename=%%~ni FOR /F "tokens=1 delims=. " %%j IN ("!_splitpath!") DO ( IF NOT "%%j"=="!_filename!" SET _dirname=%%j ) ECHO "%%i" =^> "%_destination%\!_dirname!%%~xi" COPY "%%i" "%_destination%\!_dirname!%%~xi" ) ENDLOCAL 

Sulla base del campione collegato ho esteso il codice in modo che il nome del file venga cambiato in un numero crescente, in modo che tutti i file xml vengano copiati in X: \ destinazione usando il vecchio nome di file (inserito da %%~nxf ) numero.

 @Echo Off SET /A counter=1 for /R "X:\source" %%f in (*.xml) do ( copy "%%f" "X:\destination\%%~nxf_!counter!.xml" SET /A counter=!counter!+1 echo !counter! ) 

Notare che non è ansible eseguire semplicemente questo file batch. A causa della variabile di count utilizzata nel for loop "espansione variabile ritardata" deve essere abilitata.

Pertanto, se lo script viene salvato come mycopy.cmd, è ansible avviarlo come segue:

 cmd.exe /v:on /c "mycopy.cmd"