在 PowerShell 4.0 中用文件名重命名文件夹
Renaming folder with filename in PowerShell 4.0
我有很多文件夹想要使用 PowerShell 批量重命名。在每个文件夹中,都有许多具有不同扩展名的不同文件。我想要做的是用 *.nfo 文件名重命名文件夹。
示例:
C:\foldertest\TEST\
在此文件夹中,这些文件位于:
JPG.jpg
NFO.nfo
TXT.txt
WAV.wav
在 运行 一个脚本之后,我希望将文件夹重命名为 *.nfo:
C:\foldertest\NFO\
我需要一个同时适用于 > 1 个文件夹的解决方案。
这是我的(不工作o/c):
Get-ChildItem -Path "C:\foldertest\" | Where-Object{$_.PSisContainer} | ForEach-Object -Process {
$new1Name = Get-ChildItem $_ -Filter "*.nfo" | Select-Object -ExpandProperty BaseName
Rename-Item -Path $_.FullName -NewName ($_.Name -replace $new1Name
}
更新:
我仍然有问题。该解决方案(见下文)起初似乎有效,但只是有时有效。假设有 30% 的文件夹。然后这个错误发生在其余部分:
Rename-Item : Cannot rename because item at 'C:\Users\STOFFES\Desktop\REN\blablablabla' does not exi
st.
At C:\Users\STOFFES\Desktop\REN\REN.ps1:2 char:3
+ Rename-Item (Split-Path $_ -Parent) ($_.BaseName)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
尽管大多数文件夹中都有 *.nfo 文件。
也许是这样的?
Get-ChildItem *.nfo -File -Recurse | ForEach-Object {
Rename-Item (Split-Path $_ -Parent) ([IO.Path]::GetFileNameWithoutExtension($_.Name)) -WhatIf
}
由于 -File
参数,需要 PowerShell 3+。准备好后删除 -WhatIf
。
(旁白:在 PowerShell 3.0 及更高版本中不再需要命令中的 Where-Object
过滤器,因为它具有 -File
和 -Directory
参数。)
Get-ChildItem -Path "E:\Test\Rename" -Include "*.nfo" -Recurse |
ForEach-Object {
$oldFolder = $_.DirectoryName
# New Folder Name is .nfo Filename, excluding extension
$newFolder = $_.Name.Substring(0, $_.Name.Length - 4)
# Verify Not Already Same Name
if ($_.BaseName.ToUpper() -ne $newFolder.ToUpper()) {
Write-Host "Rename: $oldFolder To: $newFolder"
Rename-Item -NewName $newFolder -Path $oldFolder
}
}
你有多层子文件夹吗?这很可能是您收到 'Cannot rename because item does not exist' 错误的原因,因为您已经重命名了父文件夹。如果是这样,您将需要更复杂的东西。
我有很多文件夹想要使用 PowerShell 批量重命名。在每个文件夹中,都有许多具有不同扩展名的不同文件。我想要做的是用 *.nfo 文件名重命名文件夹。
示例:
C:\foldertest\TEST\
在此文件夹中,这些文件位于:
JPG.jpg
NFO.nfo
TXT.txt
WAV.wav
在 运行 一个脚本之后,我希望将文件夹重命名为 *.nfo:
C:\foldertest\NFO\
我需要一个同时适用于 > 1 个文件夹的解决方案。
这是我的(不工作o/c):
Get-ChildItem -Path "C:\foldertest\" | Where-Object{$_.PSisContainer} | ForEach-Object -Process {
$new1Name = Get-ChildItem $_ -Filter "*.nfo" | Select-Object -ExpandProperty BaseName
Rename-Item -Path $_.FullName -NewName ($_.Name -replace $new1Name
}
更新:
我仍然有问题。该解决方案(见下文)起初似乎有效,但只是有时有效。假设有 30% 的文件夹。然后这个错误发生在其余部分:
Rename-Item : Cannot rename because item at 'C:\Users\STOFFES\Desktop\REN\blablablabla' does not exi
st.
At C:\Users\STOFFES\Desktop\REN\REN.ps1:2 char:3
+ Rename-Item (Split-Path $_ -Parent) ($_.BaseName)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
尽管大多数文件夹中都有 *.nfo 文件。
也许是这样的?
Get-ChildItem *.nfo -File -Recurse | ForEach-Object {
Rename-Item (Split-Path $_ -Parent) ([IO.Path]::GetFileNameWithoutExtension($_.Name)) -WhatIf
}
由于 -File
参数,需要 PowerShell 3+。准备好后删除 -WhatIf
。
(旁白:在 PowerShell 3.0 及更高版本中不再需要命令中的 Where-Object
过滤器,因为它具有 -File
和 -Directory
参数。)
Get-ChildItem -Path "E:\Test\Rename" -Include "*.nfo" -Recurse |
ForEach-Object {
$oldFolder = $_.DirectoryName
# New Folder Name is .nfo Filename, excluding extension
$newFolder = $_.Name.Substring(0, $_.Name.Length - 4)
# Verify Not Already Same Name
if ($_.BaseName.ToUpper() -ne $newFolder.ToUpper()) {
Write-Host "Rename: $oldFolder To: $newFolder"
Rename-Item -NewName $newFolder -Path $oldFolder
}
}
你有多层子文件夹吗?这很可能是您收到 'Cannot rename because item does not exist' 错误的原因,因为您已经重命名了父文件夹。如果是这样,您将需要更复杂的东西。