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?

  • Log ping e data non funzionano
  • Come creare più cartelle e denominarle leggere linee da un file di text?
  • File BAT FTP - Operazione pianificata Windows
  • Perché non è ansible eliminare un file in cui sono abilitate le autorizzazioni di scrittura di gruppo?
  • Comando per eseguire un'applicazione con privilegi di amministratore, ma non come amministratore (prompt con UAC)
  • Cambiare la directory in un file batch con PowerShell
  • Come modificare l'estensione di tutti i file selezionati contemporaneamente?
  • Come faccio a scrivere uno script batch per generare cartelle per each mese, giorno e anno?
  • Freeware client FTP con supporto di elaborazione batch
  • Qual è la velocità massima di trasferimento file su WiFi 802.11g?
  • Aggiungere il nome della cartella all'inizio del nome del file
  • Ricerca di immagini per "ha i dati Geotag"
  • 2 Solutions collect form web for “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”

    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" 
    Siamo il genio del computer e della rete.