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?

  • Posso specificare una destinazione con il command ftp get?
  • Ricerca di immagini per "ha i dati Geotag"
  • Come faccio a fare un file batch attendere / dormire per alcuni secondi?
  • Il membro del gruppo Linux non può eliminare il file con authorization rw
  • Scambia da LAN a WLAN quando raggiunge una certa soglia
  • Montare un ISO dalla row di command e get la sua lettera di unità in Windows 8
  • Come faccio a smettere di creare i file undeletable da cygwin? Oppure posso cancellarli in qualche modo?
  • Come controllare l'alimentazione alle porte USB usando batch
  • Come unire (e non sostituire) le cartelle quando si copia sul Mac?
  • Sistema di file Linux
  • riprendere un file utilizzando il curl o il wget?
  • batch convertire i file htm in pdf
  • 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.