Arquivo BAT para extrair o nome da pasta de um nome de arquivo e mover o arquivo para essa pasta

Arquivo BAT para extrair o nome da pasta de um nome de arquivo e mover o arquivo para essa pasta

Não estou muito familiarizado com a programação de arquivos bat do Windows e agradeceria qualquer ajuda com isso.

Eu preciso de um arquivo bat para fazer o seguinte:

  • extraia o nome da pasta de um nome de arquivo - por exemplo, extraia Química do nome de arquivo "123-Chemistry-101.rep". "-" pode ser usado para indicar o início e o fim do token.
  • mova o mesmo arquivo para uma pasta chamada Química. Química será um subdiretório de onde estão todos os relatórios.

Provavelmente consigo fazer a segunda parte (que encontrei neste site), mas a primeira parte está além da minha habilidade.

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

Atenciosamente, Durand

Responder1

Você pediu Batch, mas eu respondo Powershellporque acho que hoje Batchestá um pouco obsoleto para tal tarefa, esperando que seu sistema suporte 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 (mantendo a árvore de subdiretórios):

$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
}

Responder2

Execute este arquivo em lote da pasta pai dePasta Relatórios:

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 e %%i são as variáveis ​​usadas nos doisparaloops.O primeiro contém os caminhos completos para os arquivos .REP (cortesia do loop externo), e o último contém os nomes das pastas extraídos dos nomes dos arquivos (cortesia do loop interno).

for /?é o que qualquer pessoa interessada deveria procurar para obter mais ajuda (observe que em arquivos em lote os sinais% são duplicados):

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

Então, o que significa "%%~dpa%%i"? Suponha que um dos arquivos .REP localizados pelodiretóriocomando é "C:\Reports folder\123-Chemistry-101.rep".

%%~dpasignificaria a letra da unidade e o caminho do arquivo menos as aspas, ou seja C:\Reports folder\, .

%%euseria, como observei acima, o nome da pasta extraído do nome do arquivo (qualquer coisa entre dois delimitadores de hífen), portanto, neste caso Chemistry, .

Juntando tudo, "%%~dpa%%i" seria expandido para este arquivo "C:\Reports folder\Chemistry", porque é para lá que queremos que o arquivo seja movido.

informação relacionada