Movendo pastas com base na condição

Movendo pastas com base na condição

Tenho muitos arquivos Excel em uma única pasta como abaixo.

+----------------------+
| 01012019_LOC001.xlsx |
| 01012019_LOC002.xlsx |
| 01012019_LOC003.xlsx |
| 02012019_LOC001.xlsx |
| 02012019_LOC002.xlsx |
| 02012019_LOC003.xlsx |
| 03012019_LOC001.xlsx |
| 03012019_LOC002.xlsx |
| 03012019_LOC003.xlsx |
+----------------------+

uma estrutura de combinação de data mais localDDMMYYYY_LOCXXX

Quero mover esses arquivos para suas respectivas pastas criadas de forma semelhante à estrutura abaixo.

MAIN_FOLDER
|
|-LOC001
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC002
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC003
  |-01012019
  |-02012019
  |-03012019
|

Posso transferir um de cada vez com for /r %d in (01012019_LOC001.xlsx) do move "%d" "C:MAIN_FOLDER\LOC001\01012019\".

Mas estou procurando uma solução mais dinâmica. Portanto, por favor, me oriente para encontrar uma solução.

PSNote: - até mesmo uma resposta do PowerShell seria suficiente.

Responder1

Para isso, você desejará percorrer os arquivos com expansão atrasada. A menos que haja subpastas das quais você também queira extrair, eu evitaria o /rsinalizador, forpois é recursivo. O principal problema é dividir o nome do arquivo, já que cada metade é uma informação separada. Será algo assim:

@echo off

set "dir=C:\Your\Excel\File\Directory"
set "des=C:\MAIN_FOLDER"

setlocal enabledelayedexpansion
for %%A in (%dir%\*.xlsx) do (
    set "file=%%~nA"
    if not exist "%des%\!file:~-6!" md "%des%\!file:~-6!"
    if not exist "%des%\!file:~-6!\!file:~0,8!.xlsx" move /y "%dir%\%%~nxA" "%des%\!file:~-6!\!file:~0,8!.xlsx"
)

Esta é uma solução em lote, então você pode simplesmente copiá-la e colá-la no Bloco de Notas e salvá-la como um arquivo .batem vez de um arquivo .txt.

Primeiro, defini variáveis ​​para dir(diretório; onde seus arquivos Excel estão localizados atualmente) e des(destino; para onde você deseja criar suas pastas e mover seus arquivos) - você precisará editar esses valores para refletir seu ambiente. Antes de fazer qualquer outra coisa, usamos setlocal enabledelayedexpansionporque estamos trabalhando com variáveis ​​que mudam de valor a cada iteração do loop. Ele forpercorrerá todos os arquivos Excel na pasta superior do nosso diretório e os atribuirá ao parâmetro %%A; uma vez dentro do loop, definimos uma variável chamada fileas %%~nAque é apenas um parâmetro %%Areduzido apenas ao seu nome de arquivo. Usamos uma ifinstrução para verificar se a pasta desse arquivo já existe - se não existir, criamos a pasta com md, então usamos outra ifinstrução para ver se o arquivo que estamos vendo já existe na pasta que apenas verificado/feito - se isso não acontecer, movemos o arquivo para a pasta com movee suprimimos o prompt de confirmação com /y(isso /ynão é realmente necessário, pois iniciamos com uma ifdeclaração, mas é a melhor prática). O comando mover possui uma renomeação incorporada, então apenas usamos isso para seguir o esquema de nomenclatura que você deseja.

A parte cafona aqui são as substrings variáveis ​​- como suas datas e locais são números definidos de caracteres, apenas contamos esses caracteres e os extraímos conforme necessário:
!file:~-6!apenas captura os últimos seis caracteres (nossas informações LOC) enquanto !file:~0,8!captura os primeiros oito caracteres (nossas informações de data). A única outra coisa digna de nota é usar pontos de exclamação dentro de um loop que esteja usando expansão atrasada (já que essas são as variáveis ​​que estão mudando); para nossas variáveis ​​estáticas ( dire des), os sinais de porcentagem são bons o tempo todo.

Esperamos que isso faça o que você queria ou pelo menos o coloque no caminho certo.

Referência:para,substring variável,mover

Responder2

Para completar, aqui está umPowerShellversão:

$Source = 'C:\Source'
$Dest   = 'C:\Destination'

Get-ChildItem $source -filter *.xls | foreach{
   $FolderName = $_.Basename.Split('_')[1]
   If (!(Test-Path "$Dest\$FolderName")) {
      New-Item -Path $Dest -Name $FolderName -ItemType Directory | out-null
   }
   Move-Item $_.FullName "$Dest\$FolderName"
}

optei por pegar oLocalização###string dividindo o nome base no sublinhado, que por si só retorna uma matriz de string de dois elementos. O1subscrito faz referência ao segundo elemento. SeCaminho de testefalha, criamos a pasta, canalizando o retorno parafora-nulopara evitar exibição na tela. EntãoMover itemfaz exatamente o que parece! :)

Get-ChildItem

ForEach-Object

Método String.Split

Caminho de teste

Novo item

Mover item

informação relacionada