Tengo muchos archivos de Excel en una sola carpeta como se muestra a continuación.
+----------------------+
| 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 |
+----------------------+
una estructura de combinación de fecha más ubicaciónDDMMYYYY_LOCXXX
Quiero mover estos archivos a sus respectivas carpetas creadas de manera similar a la siguiente estructura.
MAIN_FOLDER
|
|-LOC001
|-01012019
|-02012019
|-03012019
|
|-LOC002
|-01012019
|-02012019
|-03012019
|
|-LOC003
|-01012019
|-02012019
|-03012019
|
Puedo transferir uno a la vez con for /r %d in (01012019_LOC001.xlsx) do move "%d" "C:MAIN_FOLDER\LOC001\01012019\"
.
Pero estoy buscando una solución más dinámica. Por lo tanto, guíeme para encontrar una solución.
PSNota: incluso una respuesta de PowerShell sería suficiente.
Respuesta1
Para esto querrás recorrer los archivos con expansión retrasada. A menos que haya subcarpetas de las que también quieras extraer, evitaría la /r
marca for
ya que es recursiva. El problema principal es dividir el nombre del archivo, ya que cada mitad es una información separada. Se verá así:
@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 es una solución por lotes, por lo que puede copiarla y pegarla en el Bloc de notas y luego guardarla como .bat
archivo .txt
.
Primero, configuré variables para dir
(directorio; donde se encuentran actualmente sus archivos de Excel) y des
(destino; donde desea crear sus carpetas y mover sus archivos); necesitará editar esos valores para reflejar su entorno. Antes de hacer cualquier otra cosa, usamos setlocal enabledelayedexpansion
ya que estamos trabajando con variables que cambian los valores en cada iteración del bucle. Recorrerá for
todos los archivos de Excel en la carpeta superior de nuestro directorio y los asignará al parámetro %%A
; Una vez dentro del bucle, configuramos una variable llamada file
as, %%~nA
que es solo un parámetro %%A
reducido a su nombre de archivo únicamente. Usamos una if
declaración para verificar si la carpeta para ese archivo ya existe; si no es así, creamos la carpeta con md
, luego usamos otra if
declaración para ver si el archivo que estamos viendo actualmente ya existe en la carpeta que buscamos. recién verificado/realizado: si no es así, movemos el archivo a la carpeta move
y suprimimos el mensaje de confirmación /y
( /y
no es realmente necesario ya que lo iniciamos con una if
declaración, pero es la mejor práctica en mi opinión). El comando mover tiene un cambio de nombre incorporado, por lo que simplemente lo usamos para seguir el esquema de nombres que deseaba.
La parte cursi aquí son las subcadenas variables: dado que sus fechas y ubicaciones son números de caracteres establecidos, simplemente contamos esos caracteres y los extraemos según sea necesario:
!file:~-6!
solo toma los últimos seis caracteres (nuestra información LOC) mientras !file:~0,8!
toma los primeros ocho caracteres (nuestra información de fecha). La única otra cosa que vale la pena señalar es el uso de signos de exclamación dentro de un bucle que utiliza expansión retrasada (ya que esas son las variables que están cambiando); para nuestras variables estáticas ( dir
y des
), los signos de porcentaje están bien en todo momento.
Esperemos que esto haga lo que querías o al menos te lleve por el camino correcto.
Referencia:para,subcadena variable,mover
Respuesta2
Para completar, aquí hay unPotencia Shellversión:
$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"
}
Opté por conseguir elUbicación###cadena dividiendo el nombre base en el guión bajo, que por sí solo devuelve una matriz de cadenas de dos elementos. El1el subíndice hace referencia al segundo elemento. SiRuta de pruebafalla, creamos la carpeta, canalizando el retorno afuera nulopara evitar la visualización de la pantalla. EntoncesMover elemento¡Hace exactamente lo que parece! :)