Archivo BAT para extraer el nombre de la carpeta de un nombre de archivo y mover el archivo a esa carpeta

Archivo BAT para extraer el nombre de la carpeta de un nombre de archivo y mover el archivo a esa carpeta

No estoy muy familiarizado con la programación de archivos bat de Windows y agradecería cualquier ayuda con esto.

Necesito un archivo bat para hacer lo siguiente:

  • extraiga el nombre de la carpeta de un nombre de archivo; por ejemplo, extraiga Química del nombre de archivo "123-Chemistry-101.rep". "-" se puede utilizar para indicar el inicio y el final del token.
  • mueva el mismo archivo a una carpeta llamada Química. Química será un subdirectorio de donde están todos los informes.

Probablemente pueda hacer la segunda parte (que encontré en este sitio), pero la primera parte está más allá de mis habilidades.

por ejemplo, para /RU:\Test %%f en (*.rep) copie %%f U:\test\Chemistry\

Saludos, Durand

Respuesta1

Usted preguntó por Batch, pero le respondo Powershellporque creo que hoy en día Batchestá un poco obsoleto para tal tarea, esperando que su sistema admita Powershell:

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep

foreach($file in $files) {
  $folder = $file.toString().split("-")[1]
  $sourcefile = "$rootDir\$file"
  $targetdir = "$rootDir\$folder"
  if(!(Test-Path -Path $targetdir )){
    New-Item -ItemType directory -Path $targetdir
  }
  Move-Item $sourcefile $targetdir
}

Editar @Karan:

Recursivo (manteniendo el árbol de subdirectorios):

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep -Recurse

foreach($file in $files) {
  $sourcefile = $file.Fullname
  $filepath = $file.PSParentPath
  $newfoldertocreate=$file.toString().split("-")[1]
  if(!(Test-Path -Path $filepath\$newfoldertocreate)){
    New-Item -ItemType directory -Path $filepath\$newfoldertocreate
  }
  Move-Item $sourcefile $filepath\$newfoldertocreate
}

Respuesta2

Ejecute este archivo por lotes desde la carpeta principal deCarpeta de informes:

for /f "delims=" %%a in ('dir /b /s "Reports folder\*.rep"') do for /f "tokens=2 delims=-" %%i in ("%%~a") do (
    if not exist "%%~dpa%%i\" md "%%~dpa%%i"
    move "%%~a" "%%~dpa%%i\"
)

%%a y %%i son las variables utilizadas en los dosparabucles. El primero contiene las rutas completas a los archivos .REP (cortesía del bucle externo) y el segundo contiene los nombres de las carpetas extraídos de los nombres de los archivos (cortesía del bucle interno).

for /?es lo que cualquier persona interesada debería buscar para obtener más ayuda (tenga en cuenta que en los archivos por lotes los signos % se duplican):

%~I  - expands %I removing any surrounding quotes (")
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only

Entonces, ¿qué significa "%%~dpa%%i"? Supongamos que uno de los archivos .REP ubicados por eldirectorioEl comando es "C:\Reports folder\123-Chemistry-101.rep".

%%~dpasignificaría la letra de unidad y la ruta del archivo menos las comillas circundantes, es decir C:\Reports folder\.

%%isería, como señalé anteriormente, el nombre de la carpeta extraído del nombre del archivo (cualquier cosa entre dos delimitadores de guión), por lo que en este caso Chemistry.

Poniéndolo todo junto, "%%~dpa%%i" para este archivo se expandiría a "C:\Reports folder\Chemistry", porque es allí donde queremos que se mueva el archivo.

información relacionada