Mover arquivos / pastas para nova estrutura

1

Gostaria de poder mover Pastas (e quaisquer subpastas e arquivos) de um local para outro; no entanto, quero apenas que uma subpasta específica seja movida de cada pasta no local inicial.

Veja um exemplo da minha estrutura de pastas existente:

E:\Estimates\Estimating Files\E27001
E:\Estimates\Estimating Files\E27001001A - Customer1\Drawings
E:\Estimates\Estimating Files\E27001001A - Customer1\Costings
E:\Estimates\Estimating Files\E27001001B - Customer2\Drawings
E:\Estimates\Estimating Files\E27001001B - Customer2\Costings
E:\Estimates\Estimating Files\E27001001C - Customer3\Drawings
E:\Estimates\Estimating Files\E27001001C - Customer3\Costings
E:\Estimates\Estimating Files\E27002
E:\Estimates\Estimating Files\E27002002A - Customer1\Drawings
E:\Estimates\Estimating Files\E27002002A - Customer1\Costings

Eu tenho muitas estimativas, como você pode ver algumas com o mesmo número, mas com uma letra de sufixo diferente, e o nome do cliente obviamente muda.

Eu quero mover apenas as pastas Desenhos para uma nova unidade e estrutura de pastas, assim:

S:\E27xxx
S:\E27xxx
E:\Estimates\Estimating Files\E27001
E:\Estimates\Estimating Files\E27001001A - Customer1\Drawings
E:\Estimates\Estimating Files\E27001001A - Customer1\Costings
E:\Estimates\Estimating Files\E27001001B - Customer2\Drawings
E:\Estimates\Estimating Files\E27001001B - Customer2\Costings
E:\Estimates\Estimating Files\E27001001C - Customer3\Drawings
E:\Estimates\Estimating Files\E27001001C - Customer3\Costings
E:\Estimates\Estimating Files\E27002
E:\Estimates\Estimating Files\E27002002A - Customer1\Drawings
E:\Estimates\Estimating Files\E27002002A - Customer1\Costings
xx\A - Customer1\ S:\E27xxx
S:\E27xxx
S:\E27xxx%pre%xx\A - Customer1\
S:\E27xxx%pre%xx\B - Customer2\
S:\E27xxx%pre%xx\C - Customer3\
S:\E27xxx%pre%xx\A - Customer1\
xx\A - Customer1\ S:\E27xxx%pre%xx\B - Customer2\ S:\E27xxx%pre%xx\C - Customer3\ S:\E27xxx%pre%xx\A - Customer1\
xx\B - Customer2\ S:\E27xxx%pre%xx\C - Customer3\ S:\E27xxx%pre%xx\A - Customer1\
xx\A - Customer1\ S:\E27xxx%pre%xx\B - Customer2\ S:\E27xxx%pre%xx\C - Customer3\ S:\E27xxx%pre%xx\A - Customer1\

As pastas Desenhos terão subpastas e arquivos que eu quero que sejam movidos para o novo local também.

Até agora, só consegui criar as pastas vazias até este nível:

%pre%

usando um pequeno arquivo de lote, para todas as estimativas de 27000 a 30000.

Mas mover os arquivos e pastas está além das minhas capacidades, espero que alguém possa me ajudar ou saber de um utilitário existente que possa funcionar!

Obrigado!

    
por Philip McGeehan 12.10.2015 / 11:03

3 respostas

0

I want to move only the Drawings folders to a new drive and folder structure, like this:

Esse arquivo em lote pode ajudar você. Ele encontra todas as subpastas "Desenhos", converte as partes dos caminhos de diretório para construir a nova estrutura de diretório e, em seguida, copia cada diretório encontrado com subdiretórios usando a ferramenta RoboCopy .

MUITO IMPORTANTE :

  • Certifique-se de colocar o arquivo em lote dentro da pasta " ... \ Estimating Files " e execute-o a partir de lá; caso contrário, defina manualmente a variável sourceDir .

  • Antes de usar este script, você deve ajustar manualmente a contagem de tokens do loop For .

    Por exemplo, usei esta pasta de origem C:\Source\Estimates\Estimating Files , precisamos perder os primeiros quatro tokens porque queremos começar a contar depois da parte Estimating Files , por isso eu defino Tokens=4,5,6 no script abaixo, se você tem um caminho diferente, então você deve ajustar os tokens.

    Se o seu diretório de origem for E:\Estimates\Estimating Files , você deverá definir o parâmetro tokens assim: Tokens=3,4,5 .

  • Se você quiser excluir automaticamente a estrutura de origem copiada, basta anexar um /Move nos parâmetros do RoboCopy.

Código-fonte

@Echo OFF

Set "sourceDir=%CD%"
Set "targetDir=C:\Target"

Set "findPattern=Drawings"

For /F "Tokens=4,5,6 Delims=\" %%a In (
    'Dir /B /S /A:D "%sourceDir%\*%findPattern%"'
) Do (
    Call Set "Token1=%%~a"
    Call Set "Token2=%%~b"
    Call Set "Token3=%%~c"
    Call Set "sourcePath=%CD%\%%~a\%%~b\%%~c"
    Call Set "targetPath=%targetDir%\%%Token1%%\%%Token1:~3%%\%%Token2:~3,2%%\%%Token2:~5%%\%%Token3%%"

    Echo+
    Call Echo Source: "%%sourcePath%%"
    Call Echo Target: "%%targetPath%%"

    (Call RoboCopy.exe "%%sourcePath%%" "%%targetPath%%" /E /ZB /COPYALL)1>Nul

)

Pause&Exit /B 0

Saída

Source: "C:\Source\Estimates\Estimating Files\E27001001A - Customer1\Drawings"

Target: "C:\Target\E27001%bl0ck_qu0te%1\A - Customer1\Drawings"

Source: "C:\Source\Estimates\Estimating Files\E27001001B - Customer2\Drawings"

Target: "C:\Target\E27001%bl0ck_qu0te%1\B - Customer2\Drawings"

Source: "C:\Source\Estimates\Estimating Files\E27001001C - Customer3\Drawings"

Target: "C:\Target\E27001%bl0ck_qu0te%1\C - Customer3\Drawings"

Source: "C:\Source\Estimates\Estimating Files\E27002002A - Customer1\Drawings"

Target: "C:\Target\E27002%bl0ck_qu0te%2\A - Customer1\Drawings"

    
por 12.10.2015 / 13:36
1

Experimente este script. Talvez seja necessário editar as letras da unidade embora

setlocal EnableDelayedExpansion
@echo off
Q:
cd "Estimating\Estimating Files"
FOR /D /R %%G IN ("*Drawings*") DO (
FOR /F "tokens=4,5 delims=\" %%H IN ("%%G") DO (
set temp=%%H
set num=!temp:~4,2!
set temp=%%I
set alpha=!temp:~5!
MKDIR "Q:\E27XXX
setlocal EnableDelayedExpansion
@echo off
Q:
cd "Estimating\Estimating Files"
FOR /D /R %%G IN ("*Drawings*") DO (
FOR /F "tokens=4,5 delims=\" %%H IN ("%%G") DO (
set temp=%%H
set num=!temp:~4,2!
set temp=%%I
set alpha=!temp:~5!
MKDIR "Q:\E27XXX%pre%XX\!num!\!alpha!\Drawings"
CALL :mover "%%G" !num! !alpha!
)
)

:mover
FOR /R %1 %%X IN (*) DO (
COPY "%%X" "Q:\E27XXX%pre%XX\%2\%3 %4 %5\Drawings"
)
XX\!num!\!alpha!\Drawings" CALL :mover "%%G" !num! !alpha! ) ) :mover FOR /R %1 %%X IN (*) DO ( COPY "%%X" "Q:\E27XXX%pre%XX\%2\%3 %4 %5\Drawings" )
    
por 12.10.2015 / 12:46
0

Aqui está o código final que usei para copiar as pastas para o novo diretório. Obrigado ao @ElektroStudios por sua ajuda.

@Echo OFF

Set "sourceDir=%CD%"
Set "targetDir=S:\E30xxx"

Set "findPattern=2 - Drawings"

For /F "Tokens=6,7,8,9 Delims=\" %%a In (
    'Dir /B /S /A:D "%sourceDir%\*%findPattern%"'
) Do (
    Call Set "Token1=%%~a"
    Call Set "Token2=%%~b"
    Call Set "Token3=%%~c"
    Call Set "Token4=%%~d"
    Call Set "sourcePath=%CD%\%%~a\%%~b\%%~c\%%~d"
    Call Set "targetPath=%targetDir%\%%Token1:~3,1%%xx\%%Token2:~4,2%%\%%Token3:~6%%"

    Echo+
    Call Echo Source: "%%sourcePath%%"
    Call Echo Target: "%%targetPath%%"

    (Call RoboCopy.exe "%%sourcePath%%" "%%targetPath%%" /E /ZB /COPYALL)1>Nul

)

Pause&Exit /B 0

Apenas um caso de se familiarizar com o RoboCoby e a tokenização da string delimitada.

    
por 15.10.2015 / 10:15