Mover carpetas según la condición

Mover carpetas según la condición

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 /rmarca forya 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 .batarchivo .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 enabledelayedexpansionya que estamos trabajando con variables que cambian los valores en cada iteración del bucle. Recorrerá fortodos 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 fileas, %%~nAque es solo un parámetro %%Areducido a su nombre de archivo únicamente. Usamos una ifdeclaración para verificar si la carpeta para ese archivo ya existe; si no es así, creamos la carpeta con md, luego usamos otra ifdeclaració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 movey suprimimos el mensaje de confirmación /y( /yno es realmente necesario ya que lo iniciamos con una ifdeclaració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 ( diry 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! :)

Get-ChildItem

Para cada objeto

Método String.Split

Ruta de prueba

Nuevo artículo

Mover elemento

información relacionada