2011-12-30 193 views
9

我想递归复制文件并重命名它们。使用powershell复制后重命名它

我的文件夹具有相同名称的文件,所以我需要在复制它时将其重命名。

但我仍然面临问题。以下是我的代码。它应该找到CopyForBuild.bat文件并将其复制到E:\ CopyForBuild文件夹中。一旦它被复制,第一个文件应该是Copyforbuild1.txt,第二个文件应该是CopyforBuild2.txt等等。

以下是我的代码。我失败的地方在哪里?

$File = Get-ChildItem -Path V:\MyFolder -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 

    Copy-Item $f "E:\copyforbuild\" 
    Rename-Item -path "E:\Copyforbuild\"+"$f" -newname "CopyForbuild"+"$i"+".txt" 
    $i = $i+1 
} 

回答

14

而在拷贝复制项目,您可以重命名文件,只需提供两地的完整路径:

copy-item c:\PST\1.config c:\PST\2.config 

这将重命名1.config到2.config。无需调用单独的重命名功能。 现在您的代码应该是这个样子:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

$i=1 
Foreach ($f in $File) 
{ 
    Copy-Item $f.FullName ("E:\copyforbuild\" + $f.BaseName + $i +".txt") 
    $i++ 
} 

你可以把它如果更短的for循环:

$File = Get-ChildItem -Path "V:\MyFolder\" -Filter CopyForbuild.bat -Recurse 

for($i = 0; $i -lt $File.Count; $i++) 
{ 
    Copy-Item $File[$i].FullName ("E:\copyforbuild\" + $File[$i].BaseName + $i +".txt") 
} 

和道路短而宽,如果遵循理查德的评论

+4

为什么不处理一次一件(并记住变量获取默认值):'Get-ChildItem -Path V:\ MyFolder -filt CoptForBuild.bat -rec | Copy-Item -dest {“E:\ copyforbuild \”+ $ _。BaseName +($ i ++)+“。txt”}'。 (具有不带类型对象参数的Cmdlet,如'Copy-Item'的目标,通过使用大括号具有内置的for-each,因此不需要循环来确定目标。) – Richard 2011-12-30 10:49:11

+0

Buddy,它抛出异常。 “Copy-Item:无法将参数绑定到参数'Path',因为它是空的。” $ File指定“*。*”时不包含任何项目 – Samselvaprabu 2011-12-30 10:57:20

+0

$ File = Get-ChildItem -Path“V:\ MyFolder \\ *。*”-Filter CopyForbuild.bat -Recurse $ i = 1 Foreach($ f在$文件) { 拷贝项目$ f.FullName( “E:\ copyforbuild \” + $ f.BaseName + $ I +) $ I ++ 名为 “txt”} – Samselvaprabu 2011-12-30 11:00:38