Necessita de ajuda para criar um arquivo de lote para renomear várias pastas

0

Tenho mais de 12.000 pastas que gostaria de renomear com os 12 primeiros caracteres do primeiro arquivo dentro de cada pasta. Por exemplo eu tenho uma pasta chamada "1", mas dentro há vários arquivos PDF e o primeiro listado tem um nome de arquivo, "201405090360.pdf" Eu quero que a pasta seja renomeada, "201405090360" é possível?

    
por SPChris 04.10.2017 / 15:34

2 respostas

1

O seguinte foi reconhecido por ter ajudado. Poderia ser melhorado com mais tratamento de erros, mas deveria fazer o trabalho ou ser usado como ponto de partida para um script mais completo.

Notas:

O script VBScript deve estar no mesmo diretório que a pasta pai, conforme a visão em árvore abaixo.

A variável strPath no topo deve ser alterada para o nome do diretório pai, ou seja, alterado de "Iniciar"

Altere blnDoIt de falso para verdadeiro para realmente fazer alterações.

Sugira a execução primeiro da seguinte forma: cscript process.vbs > log.txt

Se o arquivo de log estiver correto, altere blnDoIt para verdadeiro.

' Given this structure:
'
'│   process.vbs
'│
'└───Start
'    ├───1
'    │       123456789012aaa.txt
'    │       123456789013bbb.txt
'    │
'    ├───2
'    │       223456789012ccc.txt
'    │       223456789013ddd.txt
'    │
'    ├───3
'    │       323456789012eee.txt
'    │       323456789013fff.txt
'    │
'    ├───4
'    │       423456789012ggg.txt
'    │       423456789013hhh.txt
'    │
'    ├───5
'    │       523456789012iii.txt
'    │       523456789013jjj.txt
'    │
'    └───6
'            623456789013kkk.txt
'            623456789012jjj.txt

'===================================================================================    

dim strPath : strPath = "Start"
dim blnDoIt : blnDoIt = false

'===================================================================================
dim objFSO                  : set objFSO = CreateObject("Scripting.FileSystemObject")
dim objFolder               : set objFolder = objFSO.GetFolder(strPath)
dim strPGetAbsolutePathName : strPGetAbsolutePathName = objFSO.GetAbsolutePathName(strPath)
dim colSubfolders           : set colSubfolders = objFolder.Subfolders

'===================================================================================
for each objSubfolder in colSubfolders
    strNameOfFolder = objSubfolder.Name

    wscript.echo "Processing directory: " & strNameOfFolder
    strFileNameToUse = GetFileNameToUseAsParentDir (strNameOfFolder)

    if strFileNameToUse <> -1 then

      wscript.echo " > Chosen file to represent directory: " & strFileNameToUse
      strLeft12 = left (strFileNameToUse, 12)
      wscript.echo " > First 12 characters of file: " & strLeft12

      if blnDoIt then
        wscript.echo " > Renaming directory " & strPGetAbsolutePathName & "\" & strNameOfFolder & " to " & strPGetAbsolutePathName & "\" & strLeft12
        objFSO.MoveFolder strPGetAbsolutePathName & "\" & strNameOfFolder, strPGetAbsolutePathName & "\" & strLeft12
      else
        wscript.echo " > Rename directory " & strPGetAbsolutePathName & "\" & strNameOfFolder & " to " & strPGetAbsolutePathName & "\" & strLeft12
      end if

    else
    wscript.echo " > Skipping."
    end if

    wscript.echo ""
next
'===================================================================================

'===================================================================================
Function GetFileNameToUseAsParentDir(strDir)

    dim oFiles : Set oFiles = CreateObject("System.Collections.ArrayList")

    dim oF : set oF = objFSO.GetFolder(strPGetAbsolutePathName & "\" & strDir).Files

    wscript.echo " > " & oF.count & " files in directory."

    if oF.count > 0 then

      for each oFile In oF
        oFiles.Add oFile.name
      next

      oFiles.Sort

      GetFileNameToUseAsParentDir = oFiles(0)

    else
      GetFileNameToUseAsParentDir = -1
    end if

    set oFiles = nothing

End Function
'===================================================================================
    
por 07.10.2017 / 15:40
0

Eu usaria o Powershell. Se eu entendi suas especificações corretamente, isso deve fazer o trabalho:

# Get List of subfolders
$Folders = Get-ChildItem <FOLDER> -Directory
# Process each subfolder
Foreach ($Subfolder in $Folders){
     # Get the names all files in current subfolder
     $FileNames = (Get-ChildItem $Subfolder.FullName -File).Name
     # If folder was not empty
     if ($FileNames) {
         # Replace current name of folder with first 12 chars of the name of the first file 
         Rename-Item $Subfolder.FullName $FileNames[0].Substring(0,12) -WhatIf
    }
}

Substitua por sua pasta real, salve como arquivo * .ps1, abra um powershell e execute.

Exibirá somente os resultados, não alterará nada até que você remova "-Whatif" da terceira linha da parte inferior.

    
por 05.10.2017 / 09:40