3d1l Asked: 2021-01-25 15:50:42 +0800 CST2021-01-25 15:50:42 +0800 CST 2021-01-25 15:50:42 +0800 CST 如何重命名目录名称,将名称字符串中每个单词的第一个字母替换为大写? 772 在 Windows 10 计算机上,我一直在使用免费实用程序,例如 PFrank 工具和 Power Toys PowerRenamer。使用 PFrank,我可以将文件名中每个单词的大小写更改为大写,但不会更改目录名称。 请问您知道 Powershell、CMD 或 BASH(使用 Windows 子系统 linux)中的命令或脚本来完成此操作吗?或可以做到这一点的工具(首选开源)。由于我已经更改了文件名,因此我只想在目录名上递归地执行此操作。 谢谢。 windows bash 2 个回答 Voted swbbl 2021-01-28T23:04:27+08:002021-01-28T23:04:27+08:00 您可以使用该Kernel32方法MoveFile重命名文件和目录,而无需重命名两次。 以下代码使用新名称的相应属性(取决于类型)重命名文件和目录。 'MoveFile' 方法实际上触发了与使用 Windows 资源管理器交互执行相同的过程。 # "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)`"" } } } Best Answer postanote 2021-01-25T18:49:58+08:002021-01-25T18:49:58+08:00 从我的评论延伸。就是这个。 更新 删除了原始长答案并替换为以下内容以解决您的评论: (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 #> 关于 WhatIf/Confirm
您可以使用该
Kernel32
方法MoveFile
重命名文件和目录,而无需重命名两次。以下代码使用新名称的相应属性(取决于类型)重命名文件和目录。
从我的评论延伸。就是这个。
更新
删除了原始长答案并替换为以下内容以解决您的评论:
关于 WhatIf/Confirm