Wie kann ich einen Verzeichnisnamen umbenennen, indem ich den ersten Buchstaben jedes Wortes in der Namenszeichenfolge durch einen Großbuchstaben ersetze?

Wie kann ich einen Verzeichnisnamen umbenennen, indem ich den ersten Buchstaben jedes Wortes in der Namenszeichenfolge durch einen Großbuchstaben ersetze?

Auf einem Windows 10-Computer habe ich kostenlose Dienstprogramme wie das PFrank-Tool und Power Toys PowerRenamer verwendet. Mit PFrank konnte ich die Groß- und Kleinschreibung jedes Wortes im Dateinamen in Großbuchstaben ändern, die Verzeichnisnamen wurden dadurch jedoch nicht geändert.

Kennen Sie bitte einen Befehl oder ein Skript in Powershell, CMD oder BASH (unter Verwendung des Windows-Subsystems Linux), um dies zu erreichen? Oder ein Tool (vorzugsweise Open Source), das dies kann. Da ich die Dateinamen bereits ändere, möchte ich dies nur rekursiv für die Verzeichnisnamen tun.

Danke.

Antwort1

Aus meinem Kommentar geht hervor, dass es einfach dies ist.

Aktualisieren

Ursprüngliche lange Antwort entfernt und durch Folgendes ersetzt, um auf Ihren Kommentar einzugehen:

(Get-ChildItem -Path 'D:\Temp' -Directory -Recurse) -match 'src|dest' | 
ForEach-Object {
    "Proccessing $($PSItem.FullName) to TitleCase"
    $renameItemTempSplat = @{
        Path     = $PSitem.FullName
        NewName  = "$((Get-Culture).Textinfo.ToTitleCase($PSitem.Name.ToLower()))1"
        #WhatIf   = $true 
    }
    Rename-Item @renameItemTempSplat -PassThru | 
    Rename-Item -NewName $($((Get-Culture).Textinfo.ToTitleCase($PSitem.Name.ToLower())) -replace '1')
}
(Get-ChildItem -Path 'D:\Temp' -Directory -Recurse) -match 'src|dest'
# Results
<#
Proccessing D:\Temp\dest to TitleCase
Proccessing D:\Temp\Destination to TitleCase
Proccessing D:\Temp\src to TitleCase


    Directory: D:\Temp


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         12-Oct-20     14:27                Dest
d-----         24-Jan-21     22:24                Destination
d-----         12-Oct-20     13:27                Src
#>

Über WhatIf/Confirm

Antwort2

Kernel32Mit dieser Methode können Sie MoveFileDateien und Verzeichnisse umbenennen, ohne sie zweimal umbenennen zu müssen.

Der folgende Code benennt Dateien und Verzeichnisse um und verwendet dabei die jeweiligen Eigenschaften für den neuen Namen (abhängig vom Typ).

Die Methode „MoveFile“ löst tatsächlich den gleichen Vorgang aus, als wenn Sie sie interaktiv über den Windows Explorer ausführen würden.

# "MoveFile" works for files and folders

# only add type once
if ($null -eq ('Win32.Kernel32' -as [type])) {
    # add method 'MoveFile from' kernel32.dll
    # https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefile
    $signature = @'
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool MoveFile(string lpExistingFileName, string lpNewFileName);
'@
    Add-Type -MemberDefinition $signature -Name 'Kernel32' -Namespace Win32
}

$dirPath = 'C:\temp\CaseTest'
Get-ChildItem -LiteralPath $dirPath -Recurse -Directory | ForEach-Object {
    $parentPath = $currentName = $fileExtension = $null

    if ($_ -is [System.IO.DirectoryInfo]) {
        # Directories
        $parentPath  = $_.Parent.FullName
        $currentName = $_.Name

    } elseif ($_ -is [System.IO.FileInfo]) {
        # Files
        $parentPath    = $_.Directory.FullName
        $currentName   = $_.BaseName
        $fileExtension = $_.Extension
    }

    if ($null -notin $currentName, $parentPath) {
        $newName =  @(
            [cultureinfo]::CurrentCulture.TextInfo.ToTitleCase($currentName.ToLower()),
            $fileExtension
        ) -join ''

        $newPath    = Join-Path -Path $parentPath -ChildPath $newName
        $moveResult = [Win32.Kernel32]::MoveFile($_.FullName, $newPath)

        if (-not $moveResult) {
            # 'MoveFile' returns only $false in case of errors, 
            # so we have to build the respective exception.
            # This requires "SetLastError = true" in signature
            $win32Error     = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
            $win32Exception = [System.ComponentModel.Win32Exception]$win32Error
            Write-Error -Exception $win32Exception `
                -Message "$($win32Exception.Message) `"$($_.FullName)`""
        }
    }
}

verwandte Informationen