2011-12-30 200 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