使用powershell将多个文件夹重命名为大写而不是文件

rename multiple folder to Uppercase not files using powershell

我正在使用 powershell,其中有多个文件夹,我需要将所有文件夹名称更改为大写,而不是仅文件文件夹。

我试过下面的代码

Get-ChildItem -Path "C:\Users\Xyz\Desktop\sample" -Recurse | % { 
  if ($_.Name -cne $_.Name.ToUpper()) { ren $_.FullName $_.Name.ToUpper() } 
}

但是使用这段代码,它只改变了文件名,但我只想改变目录

例如

文件夹名(小写)

abc
cab
dab

像这样(大写)

ABC
CAB
DAB

提前致谢

这些技巧可能并不明显。这个怎么样?嗯,那实际上没有用。您不能在 powershell 中将文件夹重命名为大写的相同内容。

# doesn't work!
get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  Rename-Item -NewName { $_.name.toupper() } -whatif

有时从 powershell 调用 cmd 效果更好。首先将其作为 "whatif" 进行尝试,看看它是否符合您的要求。如果我真的理解这个问题。所有这一切都是回声字符串。这个命令就是 "pretend".

get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  foreach { write-host cmd /c ren $_.fullname $_.name.toupper() }

如果看起来不错,这实际上会重命名。但也许做一个备份以防出现问题。能够撤消操作。

get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  foreach { cmd /c ren $_.fullname $_.name.toupper() }
  • 限制Get-ChildItem的输出到目录,使用-Directory开关(PSv3+;在 PSv2 中,通过管道传输到 Where-Object { $_.PSIsContainer }

  • 除此之外,您的解决方案应该有效,但由于概念缺陷[= .NET 的 System.IO.DirectoryInfo.MoveTo() 方法(以及 System.IO.Directory.Move() 方法)中的 81=],PowerShell 的 Rename-Item cmdlet 基于 构建,从 .NET Core 3.0 preview6 / .NET 4.8 开始:

    • 该方法无法将 目录 名称的 大小写变体 识别为不同 名称,并以 Source and destination path must be different.

      失败
      • 奇怪的是,文件 没有受到影响,正如您所经历的那样。[1]
    • 当然,虽然 NTFS 是大小写不敏感,但它也是大小写保留,所以它应该可以将foo重命名为FOO,例如。

解决方法 (PSv4+):

注意: 提供了另一种解决方法,基于为每个输入文件夹调用 cmd.exe 以使用其 ren 命令。虽然它在概念上更简单,但需要注意的是,这种为每个处理的文件夹创建子进程的方法效率低且速度慢。也就是说,对于偶尔的重命名操作可能无关紧要。

$path = 'C:\Users\Xyz\Desktop\sample'

Get-ChildItem -LiteralPath $path -Recurse -Directory |
  Where-Object { $_.Name -cne $_.Name.ToUpper() } -PipelineVariable dir |  
    Rename-Item -PassThru -NewName { [IO.Path]::GetRandomFileName() } |
      Rename-Item -NewName { $dir.Name.ToUpper() }

解决方法暂时 将匹配的文件夹重命名为临时的、随机生成的名称 ([IO.Path]::GetRandomFileName()),然后然后 应用所有-原始名称的大写版本。

输入文件夹的原始状态和名称通过变量 $dir 捕获,该变量 "stashed" 供以后通过通用 -PipelineVariable 参数使用。


[1] 警告:当您使用 Get-ChildItemGet-Item 通过其文字名称报告特定目录或文件时,无论大小写如何变化 specify 会返回报告,即使存储在文件系统 中的真实大小写变化 可能不同(相比之下,文件资源管理器始终向您显示真实大小写)。要查看真实情况,请使用
Get-ChildItem <parentDir> -Filter <name>
,或者,作为可能显示其他项目的快速解决方法,将 * 附加到 name/path。在这两种情况下,名称都被视为通配符模式,匹配过程的结果反映真实情况。

如何将文件夹名称用双引号引起来?有些文件夹有空格...

write-host cmd /c ren $.fullname $.name.toupper()