Estou reorganizando os dados existentes e preciso criar um novo subdiretório para receber todos os arquivos e diretórios existentes. O objetivo é abrir espaço para uma nova linha de produtos e, ao mesmo tempo, melhorar a convenção de nomenclatura dos dados existentes.
Por exemplo, dados que atualmente se parecem com isso:
\root directory\
+-proj1357
+-closing binder
+-refi
+-compliance
+-proj2468
+-disbursements
+-compliance
+-proj3579
+-pre-close
+-compliance
Deverá se parecer com isso:
\root directory\
+-proj1357
+-dpl
+-closing binder
+-refi
+-compliance
+-proj2468
+-dpl
+-disbursements
+-compliance
+-proj3579
+-dpl
+-pre-close
+-compliance
O problema que estou tendo é que não consigo obter o comando certo sem ficar preso em um loop recursivo. Enquanto hacking isso junto, eu freqüentemente corri para o erro ", não é possível executar uma cópia cíclica".
A boa notícia é que tenho uma solução funcional, mas são necessários três comandos separados e uma sintaxe personalizada para cada diretório do projeto.
command 1> ROBOCOPY G:\proj1357 DPL /E /MOVE
command 2> MOVE G:\proj1357\DPL\DPL\*.* G:\proj1357\DPL
command 3> RMDIR G:\proj1357\DPL\DPL\
Tanto quanto eu posso dizer, o comando 1 move todos os arquivos e diretórios para o novo subdiretório. Isso também causa um problema recursivo ao mover os arquivos no diretório em nível de projeto para um subdiretório mais profundo. Então eu confio no Command 2 para recuperar arquivos que já foram no diretório de nível de projeto. Em seguida, o Comando 3 remove o subdiretório mais profundo.
Existe uma maneira melhor de executar um comando ou arquivo em lote por meio de um sistema baseado no Windows? O ideal seria rastrear todos os diretórios em nível de projeto e mover o conteúdo para o novo subconjunto -diretório. Eu estou olhando para o processamento de mais de mil projetos, então eu acho que vale a pena descobrir como fazer o loop corretamente.
Para um contexto mais visual do que estou enfrentando, veja a imagem abaixo.
ATUALIZADO
Depoisdetentarfazê-lofuncionarusandoométododelinhadecomandodetrêsetapasdescritoacima,cedieadapteiarespostadojiggunjerparaajustar-seaomeuambiente.AbaixoestáoarquivodelotedoMSqueeuusei.Eutambémadicioneiobservaçõesparaesclareceropropósitodecadalinha.
@echooffremrunthisbatchfileintopleveldirectoryremtopleveldirectoryshouldcontainallprojectnumberdirectoriesremassumesthatalldirectoriesstartingwithadigitareprojectnumberdirectoriesreminitializethelistingofalldirectoriessetrootlist=dir/b/a:Dreminitializenumericalfilteringsetfilter=findstr"^[1-9]"
rem loop through all directories that comply with filtering (start with a digit)
rem use command extension /F to process (in this case) command output
rem identifies all project number parent-directories
rem assign parent-directories to variable %%P, as in 'Project'
FOR /F %%P in ('%rootlist% ^| %filter%') DO (
rem pass the variable %%P to the moveproject loop
call :moveproject "%%P"
rem move files that were ignored by the robocopy command
rem these are 'loose' files that were in the project number directory, but not saved in any subdirectory
rem assumes the robocopy command successfully creates the DPL directory
MOVE %%P\*.* %%P\DPL\
)
rem pause to review command log
pause
:moveproject
rem ensure that the parameter has value
rem converts variable %%P to parameter no. 1
if not [%1] == [] (
rem loop through all sub-directories under each project number
rem use command extension /D to process directories only
rem removing any surrounding quotes (") from parameter no. 1 by using optional syntax -- percent-tilde
rem assign sub-directories to variable %%O, as in 'Origin'
FOR /D %%O IN ("%~1\*") DO (
rem display values
echo project number %%P
echo directory origin %%O
rem delimit origin directory using backslash character
rem use command extension /F to process (in this case) strings
rem assign the second delimited piece to variable %%D, as in 'Destination'
rem effectively drops all text to the left of the first backslash character
FOR /F "tokens=2 delims=\" %%D IN ("%%O") DO (
rem display values
echo %%D
echo directory destination %%P\DPL\%%D
rem move all directories to DPL sub-directory
rem simultaniously creates the receiving DPL directory
robocopy /E /MOVE "%%O" "%%P\DPL\%%D"
)
)
)