2011-12-30 26 views
9

Tôi đang cố gắng sao chép đệ quy các tệp và đổi tên chúng.Đổi tên nó sau khi sao chép bằng cách sử dụng powershell

Thư mục của tôi có tệp có cùng tên, vì vậy tôi cần đổi tên nó vào thời điểm tệp được sao chép.

Nhưng tôi đang gặp vấn đề. Sau đây là mã của tôi. Nó sẽ tìm thấy tập tin CopyForBuild.bat và sao chép nó vào thư mục E: \ CopyForBuild. Một khi nó được sao chép, tập tin đầu tiên nên được Copyforbuild1.txt, thứ hai sẽ là CopyforBuild2.txt và như vậy.

Sau đây là mã của tôi. Tôi đang thất bại ở đâu?

$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 
} 

Trả lời

14

Bạn có thể đổi tên tập tin khi sao chép trong Copy-Item, chỉ cung cấp đường dẫn đầy đủ ở cả hai nơi:

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

này sẽ đổi tên 1.config để 2.config. Không cần phải gọi chức năng đổi tên riêng biệt. Mã của bạn bây giờ sẽ giống như thế này:

$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++ 
} 

Bạn có thể làm cho nó thậm chí còn ngắn hơn nếu sử dụng Đối với loop:

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

Hoặc cách ngắn hơn và rộng hơn nếu làm theo lời nhận xét của Richard

+4

Tại sao không trình mọi thứ tại một thời điểm (và nhớ các biến nhận giá trị mặc định): 'Get-ChildItem -Path V: \ MyFolder -filt CoptForBuild.bat -rec | Copy-Item -dest {"E: \ copyforbuild \" + $ _. BaseName + ($ i ++) + ". Txt"} '. (Cmdlets với các tham số không lấy đối tượng kiểu, như đích của 'Copy-Item', có sẵn cho mỗi bằng cách sử dụng niềng răng để không cần vòng lặp để xác định đích.) – Richard

+0

Buddy, Nó ném ngoại lệ . "Copy-Item: Không thể liên kết đối số với tham số 'Đường dẫn' bởi vì nó là null." $ File không chứa các mục khi chỉ định "*. *" – Samselvaprabu

+0

$ File = Get-ChildItem -Path "V: \ MyFolder \\ *. *" -Filter CopyForbuild.bat -Recurse $ i = 1 Foreach ($ f trong $ File) { Bản sao $ F.FullName ("E: \ copyforbuild \" + $ f.BaseName + $ i + ". txt") $ i ++ } – Samselvaprabu

Các vấn đề liên quan