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
#>
Antwort2
Kernel32
Mit dieser Methode können Sie MoveFile
Dateien 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)`""
}
}
}