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 /r
sinalizador, for
pois é 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 .bat
em 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 enabledelayedexpansion
porque estamos trabalhando com variáveis que mudam de valor a cada iteração do loop. Ele for
percorrerá 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 file
as %%~nA
que é apenas um parâmetro %%A
reduzido apenas ao seu nome de arquivo. Usamos uma if
instrução para verificar se a pasta desse arquivo já existe - se não existir, criamos a pasta com md
, então usamos outra if
instruçã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 move
e suprimimos o prompt de confirmação com /y
(isso /y
não é realmente necessário, pois iniciamos com uma if
declaraçã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 ( dir
e 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! :)