使用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
,例如。
- 问题已在 this GitHub issue 中报告。
解决方法 (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-ChildItem
或 Get-Item
通过其文字名称报告特定目录或文件时,无论大小写如何变化 specify 会返回报告,即使存储在文件系统 中的真实大小写变化 可能不同(相比之下,文件资源管理器始终向您显示真实大小写)。要查看真实情况,请使用
Get-ChildItem <parentDir> -Filter <name>
,或者,作为可能显示其他项目的快速解决方法,将 *
附加到 name/path。在这两种情况下,名称都被视为通配符模式,匹配过程的结果反映真实情况。
如何将文件夹名称用双引号引起来?有些文件夹有空格...
write-host cmd /c ren $.fullname $.name.toupper()
我正在使用 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
,例如。- 问题已在 this GitHub issue 中报告。
解决方法 (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-ChildItem
或 Get-Item
通过其文字名称报告特定目录或文件时,无论大小写如何变化 specify 会返回报告,即使存储在文件系统 中的真实大小写变化 可能不同(相比之下,文件资源管理器始终向您显示真实大小写)。要查看真实情况,请使用Get-ChildItem <parentDir> -Filter <name>
,或者,作为可能显示其他项目的快速解决方法,将 *
附加到 name/path。在这两种情况下,名称都被视为通配符模式,匹配过程的结果反映真实情况。
如何将文件夹名称用双引号引起来?有些文件夹有空格...
write-host cmd /c ren $.fullname $.name.toupper()