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 Powershell
porque acho que hoje Batch
está 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.