PowerShell:使用 $_.FullName.Replace 重命名多个文件夹
PowerShell: Rename multiple folders using $_.FullName.Replace
我有一个 google 驱动器文件夹偶尔会不同步。 Google(或某人)会将 (1) 附加到 directory/file 名称。然后它将删除原始目录,我将有一堆名为 "xxx (1)" 的文件夹和文件。
我一直在尝试编写一个 powershell 脚本,该脚本将抓取目录树并通过简单地删除“(1)”部分来重命名 folders/files。我意识到这可能会导致一些冲突,但我希望使用脚本替换其中的大部分。我不太关心目录结构,如果需要我会恢复,但这有点麻烦。
我已经尝试了几个 powershell 脚本,到目前为止我最接近的是这个...
这将 return 正确的新文件夹名称
Get-ChildItem -Path "* (1)" -Recurse | select { $_.FullName.Replace(" (1)", "")}
所以我尝试了这个...
Get-ChildItem -Path "* (1)" -Recurse | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
我收到错误 "You cannot call a method on a null-valued expression."
You cannot call a method on a null-valued expression.
At line:1 char:1
+ Get-ChildItem -Path "* (1)" -Recurse | rename-item $_.FullName $_.Fu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
尝试将后半部分包围在 foreach-object 中,使用 Rename-Item 而不是 Replace-Item 等等:
Get-ChildItem -Path "* (1)" -Recurse | ForEach-Object {Rename-Item -Path $_.Fullname -NewName $($_.Name.Replace(" (1)", "")) -WhatIf}
$_
只是脚本块中的一个变量。有:
.. | select { $_.FullName.Replace(" (1)", "")}
可以get-help select-object
看到第一个位置参数是-Property
,所以这是
的缩写
.. | Select-Object -Property { $_.FullName.Replace(" (1)", "") }
现在您可以看到脚本块通过管道获取文件,以 $_
访问它们并为输出计算新的 属性,并使用 $_
每个文件一次。当您尝试在第二行中使用相同的技术时:
.. | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
$_
只是自由浮动,你不能那样使用它,在 {}
脚本块之外它没有任何意义。您正在通过管道输入文件,并尝试使用 -Path 指定它们,这会加倍 - 冲突和冗余。而且您使用的是替换而不是重命名。
所以在另一个答案中,nferrell 使用 ForEach 创建了一个脚本块。并将文件通过管道传输到 ForEach,然后将它们的名称指定给 Rename-Item 的 -Path。
哪个可行,但它冗长且迂回。为什么要将文件名从管道中取出并使用 ForEach 将它们随机移动到 cmdlet 的另一端,然后直接将它们放回原处?
Get-ChildItem .. | Rename-Item -NewName { $_.Name.Replace(" (1)", "") }
文件通过管道进入,NewName是计算出来的。没有循环,没有加倍输入,没有
我有一个 google 驱动器文件夹偶尔会不同步。 Google(或某人)会将 (1) 附加到 directory/file 名称。然后它将删除原始目录,我将有一堆名为 "xxx (1)" 的文件夹和文件。
我一直在尝试编写一个 powershell 脚本,该脚本将抓取目录树并通过简单地删除“(1)”部分来重命名 folders/files。我意识到这可能会导致一些冲突,但我希望使用脚本替换其中的大部分。我不太关心目录结构,如果需要我会恢复,但这有点麻烦。
我已经尝试了几个 powershell 脚本,到目前为止我最接近的是这个...
这将 return 正确的新文件夹名称
Get-ChildItem -Path "* (1)" -Recurse | select { $_.FullName.Replace(" (1)", "")}
所以我尝试了这个...
Get-ChildItem -Path "* (1)" -Recurse | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
我收到错误 "You cannot call a method on a null-valued expression."
You cannot call a method on a null-valued expression.
At line:1 char:1
+ Get-ChildItem -Path "* (1)" -Recurse | rename-item $_.FullName $_.Fu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
尝试将后半部分包围在 foreach-object 中,使用 Rename-Item 而不是 Replace-Item 等等:
Get-ChildItem -Path "* (1)" -Recurse | ForEach-Object {Rename-Item -Path $_.Fullname -NewName $($_.Name.Replace(" (1)", "")) -WhatIf}
$_
只是脚本块中的一个变量。有:
.. | select { $_.FullName.Replace(" (1)", "")}
可以get-help select-object
看到第一个位置参数是-Property
,所以这是
.. | Select-Object -Property { $_.FullName.Replace(" (1)", "") }
现在您可以看到脚本块通过管道获取文件,以 $_
访问它们并为输出计算新的 属性,并使用 $_
每个文件一次。当您尝试在第二行中使用相同的技术时:
.. | Replace-Item -Path $_.FullName -Destination $_.FullName.Replace(" (1)", "") -WhatIf
$_
只是自由浮动,你不能那样使用它,在 {}
脚本块之外它没有任何意义。您正在通过管道输入文件,并尝试使用 -Path 指定它们,这会加倍 - 冲突和冗余。而且您使用的是替换而不是重命名。
所以在另一个答案中,nferrell 使用 ForEach 创建了一个脚本块。并将文件通过管道传输到 ForEach,然后将它们的名称指定给 Rename-Item 的 -Path。
哪个可行,但它冗长且迂回。为什么要将文件名从管道中取出并使用 ForEach 将它们随机移动到 cmdlet 的另一端,然后直接将它们放回原处?
Get-ChildItem .. | Rename-Item -NewName { $_.Name.Replace(" (1)", "") }
文件通过管道进入,NewName是计算出来的。没有循环,没有加倍输入,没有