2012-03-29 69 views
0

我最近开始使用PowerShell的,因为我觉得它非常有用和强大的:)PowerShell的 - 包含一个值

Recursivly改变路径,这是该方案: 客户有用来在它的逗号的文件夹结构。 由于最新的程序添加,由于逗号,此操作失败。 从本质上讲,他们只是想用逗号替换“ - ”

这就是我所拥有的......它可以工作,但我觉得它效率低下。 该脚本完成应有的功能,但只要改变了一个路径,剩下的就会失败,因为原来的路径已经改变了,你跟着我? :)

$folderpath = "C:\pathcontainingcomma" 
foreach ($i in get-childitem $folderpath -Recurse) { 
    $name = $i.name.replace(","," - ") 
    Rename-Item -Path $i.fullname -NewName $name -Force -Verbose 
} 

我希望我解释说不够好,请提问,如果您有任何:)

回答

1

您将需要由内而外重新命名,以避免改变你仍然需要处理的路径,所以我猜下面应该工作:

$folderpath = 'C:\pathcontainingcomma' 
$items = Get-ChildItem -Recurse $folderpath 
[Array]::Reverse($items) 
$items | ForEach-Object { Rename-Item -Path $_ -NewName ($_ -replace ',', '-') -Force -Verbose } 
+0

无法将参数绑定到参数'Path',因为它为空。 我们在这里错过了什么吗?我没有看到$我任何地方要么..而且它不是$项目,然后我得到这个错误: Rename-Item:无法将'System.Object []'转换为参数所需的类型'System.String' '路径'。指定的方法 od不支持。 它应该是$ items.Name例如? – 2012-03-29 06:48:37

+1

对不起,你的代码太忠实了。我刚刚使用管道重写了它,因为我认为'foreach(){}'通常不是PowerShell中非常习惯的解决方案。 – Joey 2012-03-29 07:05:19

+0

不,'$ items'是一个数组(它在实际循环之前被反转)。 'ForEach-Object'允许通过'$ _'访问当前的管道元素(通常在涉及脚本块的管道中)。 – Joey 2012-03-29 07:07:08

1

试试这个:

Get-ChildItem $folderPath -r '*,*' -name | foreach { 
$p = "$folderPath\$_"; rename-item $p ($p -replace ',',' - ') -whatif } 

-Name参数在此处非常方便,因为输出顺序为-Name将允许您首先重命名较高级目录,而替换则在您通过输出进行foreach时修复路径的所有元素。