Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell:使用$\.FullName.Replace重命名多个文件夹_Powershell_Rename Item Cmdlet - Fatal编程技术网

PowerShell:使用$\.FullName.Replace重命名多个文件夹

PowerShell:使用$\.FullName.Replace重命名多个文件夹,powershell,rename-item-cmdlet,Powershell,Rename Item Cmdlet,我有一个谷歌硬盘文件夹,偶尔会失去同步。谷歌(或其他人)将在目录/文件名后追加(1)。然后它将删除原始目录,我将有一堆名为“xxx(1)”的文件夹和文件 我一直在尝试编写一个powershell脚本,它将通过删除“(1)”部分对目录树进行爬网并重命名文件夹/文件。我意识到这可能会导致一些冲突,但我希望用脚本替换其中的大多数冲突。我不太关心目录结构,如果需要的话我会恢复,但这只是一种麻烦 我已经尝试了几个powershell脚本,到目前为止,我最接近的是这个 这将返回正确的新文件夹名称 Get-C

我有一个谷歌硬盘文件夹,偶尔会失去同步。谷歌(或其他人)将在目录/文件名后追加(1)。然后它将删除原始目录,我将有一堆名为“xxx(1)”的文件夹和文件

我一直在尝试编写一个powershell脚本,它将通过删除“(1)”部分对目录树进行爬网并重命名文件夹/文件。我意识到这可能会导致一些冲突,但我希望用脚本替换其中的大多数冲突。我不太关心目录结构,如果需要的话我会恢复,但这只是一种麻烦

我已经尝试了几个powershell脚本,到目前为止,我最接近的是这个

这将返回正确的新文件夹名称

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)", "") }