Potrzebujesz pomocy przy tworzeniu pliku wsadowego, aby zmienić nazwę wielu folderów

0

Mam ponad 12 000 folderów, których nazwę chciałbym zmienić przy użyciu pierwszych 12 znaków pierwszego pliku w każdym folderze. Na przykład mam folder o nazwie „1”, ale w środku znajduje się kilka plików PDF, a pierwszy na liście ma nazwę „201405090360.pdf”. Chcę zmienić nazwę folderu „201405090360”. Czy to możliwe?

SPChris
źródło
1
Czy wszystkie podkatalogi jednego katalogu czy mówimy tutaj o złożonej strukturze katalogów? Pierwszy wymieniony jako alfabetycznie?
cokolwiek
Obecnie foldery znajdują się na dysku zewnętrznym, a następnie struktura zawiera kilka innych folderów, zanim przejdziesz do folderów, których nazwę chcę zmienić, wygląda następująco: Komputer> Moja książka (F :)> Raporty szeryfa> Pliki załączników do spraw> 57 Niektóre z te foldery zawierają jeden plik PDF, podczas gdy inne zawierają wiele plików PDF, ale wszystkie pliki w środku zaczynają się od tych samych 12 znaków. Wydają się być w kolejności alfabetycznej
SPChris
Czy to pomogłoby ci zacząć: pastebin.com/0Qr9ksME Uwaga: blnDoIt jest ustawiony na false, więc nie będzie dokonywał żadnych zmian, dopóki nie zmienisz go na true. Umożliwi to przetestowanie go w pierwszej kolejności. Aby uruchomić, edytuj strPath, aby był nazwą katalogu najwyższego poziomu, przywoływany vbscript powinien znajdować się w tym samym katalogu, zapisz go na przykład jako script.vbs. Następnie uruchom w administracyjnym wierszu polecenia, cscript script.vbs > log.txtmam nadzieję, że plik dziennika ma oczekiwane wyniki.
HelpingHand
Cieszę się, że pomogło. Przykład programu PowerShell autorstwa @wszystko, co również wygląda na to, że powinien działać, sprawdza, czy w każdym katalogu jest plik do użycia.
HelpingHand,
@HelpingHand może opublikować kod jako odpowiedź tutaj, aby SPChris mógł oznaczyć go jako zaakceptowaną odpowiedź?
cokolwiek

Odpowiedzi:

1

Uznano, że następujące pomogły. Można go ulepszyć dzięki większej obsłudze błędów, ale powinien on wykonać zadanie lub posłużyć jako punkt wyjścia dla bardziej kompletnego skryptu.

Uwagi:

Skrypt VBScript powinien znajdować się w tym samym katalogu, co folder nadrzędny, zgodnie z widokiem drzewa poniżej.

Zmienna strPath u góry powinna zostać zmieniona na nazwę katalogu nadrzędnego, tj. zmieniona z „Start”

Zmień blnDoIt z false na true, aby faktycznie wprowadzić zmiany.

Sugeruje uruchomienie go w następujący sposób: cscript process.vbs> log.txt

Jeśli plik dziennika wygląda poprawnie, zmień wartość blnDoIt na true.

' 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
'===================================================================================
Pomocna dłoń
źródło
0

Użyłbym Powershell. Jeśli poprawnie zrozumiałem twoje specyfikacje, powinno to wykonać zadanie:

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

Zamień na swój prawdziwy folder, zapisz jako plik * .ps1, otwórz PowerShell i uruchom.

Wyświetli tylko wyniki, niczego nie zmieni, dopóki nie usuniesz „-Whatif” z trzeciego wiersza od dołu.

cokolwiek
źródło