2011-06-25 76 views
2

我试图重新命名某些文件,然后将它们复制到如下备份位置:重命名,然后复制不工作

gci $src ` 
    | ?{!$_.psiscontainer -and $_.extension.length -eq 0 -and $_ -match "tmp_\d{1}$"} ` 
    | %{ ren -path $_.fullname -new ($_.name + ".ext") } ` 
    | %{ cpi -path $_.fullname -dest $bkup -force} 

的重命名部分工作正常。但重命名的文件不会被复制到备份位置。我在这里做错了什么?

回答

2

默认情况下,项目更名不会回压入管道,使用-PassThru开关,以将它们传递:

gci $src ` 
    | ?{!$_.psiscontainer -and $_.extension.length -eq 0 -and $_ -match "tmp_\d{1}$"} ` 
    | %{ ren -path $_.fullname -new ($_.name + ".ext") -PassThru } ` 
    | %{ cpi -path $_.fullname -dest $bkup -force} 
+0

我喜欢这个答案,因为这与我想达到的最接近。谢谢zdan。 – Animesh

4

Rename-Item不会返回任何内容,因此没有任何内容可以传递给Copy-Item。您可以将每个块的两个命令放在一起:

gci $src ` 
    | ?{!$_.psiscontainer -and $_.extension.length -eq 0 -and $_ -match "tmp_\d{1}$"} ` 
    | %{ $renamedPath = $_.FullName + ".ext"; ` 
     ren -path $_.FullName -new $renamedPath; ` 
     cpi -path $renamedPath -dest $bkup -force } 
2

您可以在一个操作中使用move-item完成这两个操作。

gci $src 
    | ?{!$_.psiscontainer -and $_.extension.length -eq 0 -and $_ -match "tmp_\d{1}$"} 
    | %{ 
     $newname = $_.Name + ".ext" 
     move-item -path $_.FullName -dest "$bkup\$newname" 
     } 
+3

重命名和副本不像搬家一样。 –

1

一个内胆:

gci $src | ?{!$_.psiscontainer -and !$_.extension -and $_ -match 'tmp_\d$'} | move-item -dest {"$bkup\$($_.Name + '.ext')"} 
+0

我喜欢这个,但我不想要一个'move-item'来完成我想要做的事情。感谢您的回答。 '-match'tmp_ \ d $'等价于'-match'tmp_ \ d {1} $'? – Animesh

+1

move-item用于重命名对象,而不是对同一任务使用两个其他命令(复制和重命名)。顺便说一下,你可以用copy来代替移动,它也应该可以工作。 'tmp_ \ d $'与'tmp_ \ d {1} $'相同,因为它只匹配一个数字。 –