如何修改这个PowerShell脚本以包括将目录名称更改为小写?

3

我想把所有文件和目录名改为小写,然后我在这里找到一段powershell脚本:Rename files to lowercase in Powershell

我最喜欢的答案是以下内容,因为它是最干净和简洁的答案。然而,它不包括目录名称,而且我目前没有足够的声望回复该评论。

Get-ChildItem -r | Where-Object { !$_.PSIsContainer } | Rename-Item -NewName { $_.FullName.ToLower() }

我不了解PowerShell,也不打算成为专家,请跳过所有细节,我只需要代码来将我的所有文件和目录重命名为小写,不需要知道它是如何工作的。我不喜欢以下解决方案,因为它过于冗长,并且仅适用于目录名称而不是文件名称。

Where-Object { $_.PSIsContainer -And $_.Name -CMatch "[A-Z]" } |
ForEach-Object {
    $NName = $_.Name.ToLowerInvariant()

    # Set temporary name to enable rename to the same name; Windows is not case sensitive
    $TempItem = Rename-Item -Path $_.FullName -NewName "x$NName" -PassThru

    Rename-Item -Path $TempItem.FullName -NewName $NName
}

我希望有一个简单的命令可以重命名文件和目录,类似于第一个示例


当我最初写这篇文章时,我只是想打开PowerShell并粘贴一个命令。事后看来,那也不是最有效的方法。因此,我最终保存了每个脚本(一个用于文件,一个用于文件夹)到一个.ps1文件中,然后将其放在任何你想要修改的目录中,右键单击并选择“使用 PowerShell 运行”,它将重命名所有文件和子目录。

该脚本如下:

# files to lower
Get-ChildItem -r | Where-Object { !$_.PSIsContainer } |
Rename-Item -NewName { $_.FullName.ToLower() }

# folders to lower
$fso = New-Object -ComObject Scripting.FileSystemObject
Get-ChildItem . -rec -dir |
ForEach-Object { $fso.MoveFolder($_.fullname, $_.Fullname.ToLower()) }

@SantiagoSquarzon 我刚刚测试了一下,结果出现了IO错误:“Rename-Item:源路径和目标路径必须不同。” - Kyle D
1
我删掉了我的回答,因为它只适用于Linux,由于操作系统的大小写敏感性。这也与此相关 https://github.com/PowerShell/PowerShell/issues/12483,`[Directory] :: Move()具有相同的行为,因此我们在PS中看到这种情况似乎是一个很好的借口。你最好使用ren` 命令从CMD或者对于PS,将文件夹重命名为临时名称,然后重新命名为小写,这实在是太糟糕了(这就是你的第二个片段正在做的事情...)。 - Santiago Squarzon
1
放心吧兄弟,感谢你的跟进。你提供的Git问题链接很好地解释了发生了什么。这只是出于个人偏好而转换为小写,并不紧急。 - Kyle D
1个回答

2

如您所提供的代码所述,Windows不区分大小写,因此需要将目录重命名为临时名称(例如,在其后插入一个字符)然后再次重命名(通过删除插入的字符)。

我修改了您的代码行以便能够同时将目录和文件名都改为小写,请尝试使用以下修改后的代码:

Get-ChildItem -r  | Rename-Item -NewName { $_.Name.ToLower().Insert(0,'_') } -PassThru |  Rename-Item -NewName { $_.Name.Substring(1) }

在Windows上对我有效,谢谢! - Kyle D
你好,Kyle,欢迎。 - Mahmoud Moawad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接