PowerShell:使用$\.FullName.Replace重命名多个文件夹
我有一个谷歌硬盘文件夹,偶尔会失去同步。谷歌(或其他人)将在目录/文件名后追加(1)。然后它将删除原始目录,我将有一堆名为“xxx(1)”的文件夹和文件 我一直在尝试编写一个powershell脚本,它将通过删除“(1)”部分对目录树进行爬网并重命名文件夹/文件。我意识到这可能会导致一些冲突,但我希望用脚本替换其中的大多数冲突。我不太关心目录结构,如果需要的话我会恢复,但这只是一种麻烦 我已经尝试了几个powershell脚本,到目前为止,我最接近的是这个 这将返回正确的新文件夹名称PowerShell:使用$\.FullName.Replace重命名多个文件夹,powershell,rename-item-cmdlet,Powershell,Rename Item Cmdlet,我有一个谷歌硬盘文件夹,偶尔会失去同步。谷歌(或其他人)将在目录/文件名后追加(1)。然后它将删除原始目录,我将有一堆名为“xxx(1)”的文件夹和文件 我一直在尝试编写一个powershell脚本,它将通过删除“(1)”部分对目录树进行爬网并重命名文件夹/文件。我意识到这可能会导致一些冲突,但我希望用脚本替换其中的大多数冲突。我不太关心目录结构,如果需要的话我会恢复,但这只是一种麻烦 我已经尝试了几个powershell脚本,到目前为止,我最接近的是这个 这将返回正确的新文件夹名称 Get-C
Get-ChildItem -Path "* (1)" -Recurse | select { $_.FullName.Replace(" (1)", "")}
所以我试过这个
Get-ChildItem -Path "* (1)" -Recurse | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
我得到一个错误“您不能对空值表达式调用方法。”
尝试在foreach对象中围绕最后一半,使用重命名项而不是替换项,等等:
Get-ChildItem -Path "* (1)" -Recurse | ForEach-Object {Rename-Item -Path $_.Fullname -NewName $($_.Name.Replace(" (1)", "")) -WhatIf}
$是脚本块中的一个变量。与:
.. | select { $_.FullName.Replace(" (1)", "")}
您可以获取帮助选择对象
,并查看第一个位置参数是-Property
,因此这是
.. | Select-Object -Property { $_.FullName.Replace(" (1)", "") }
现在,您可以看到scriptblock通过管道获取文件,以$\uu
的形式访问它们,并为输出计算一个新属性,$\u
对每个文件使用一次。当您尝试在第二行中使用相同的技术时:
.. | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
$\
只是自由浮动的,你不能这样使用它,在{}
脚本块之外,它没有任何意义。您通过管道将输入文件导入,并尝试使用-Path来指定它们,这是双重冲突和冗余。您使用的是替换而不是重命名
因此,在另一个答案中,nferrell使用ForEach创建脚本块。并将文件导入ForEach,然后将其名称指定给Rename项的-Path
这是可行的,但它冗长而迂回。为什么要将文件名从管道中取出,并使用ForEach将它们洗牌到cmdlet的另一端,然后直接将它们放回管道中
Get-ChildItem .. | Rename-Item -NewName { $_.Name.Replace(" (1)", "") }
文件通过管道进入,计算NewName。没有循环,没有输入加倍,没有我想是这样的。谢谢@nferrell在这个Powershell中有如此多的魔力,我仍然需要学习。谢谢@TessellingEckler。我希望我能给你分数。显然,我是个新手,不会同意任何建议,但我真的很感激这一彻底的回应。
Get-ChildItem .. | Rename-Item -NewName { $_.Name.Replace(" (1)", "") }