2011-12-30 13 views
9

ファイルを再帰的にコピーして名前を変更しようとしています。powershellを使用してコピーした後で名前を変更します。

私のフォルダには同じ名前のファイルがあるので、コピーするときに名前を変更する必要があります。

しかし、私は直面している問題です。以下は私のコードです。 CopyForBuild.batファイルを見つけ、それをE:\ CopyForBuildフォルダにコピーする必要があります。コピーが完了すると、最初のファイルはCopyforbuild1.txt、2番目のファイルは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 

これは2.configに1.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++ 
} 

あなたがループに使用する場合、それはさらに短くすることができます:

$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

なぜプロセスに従うならば短く、より広いです一度に1つずつ(変数がデフォルト値を取得することを忘れないでください): 'Get-ChildItem -Path V:\ MyFolder -filt CoptForBuild.bat -rec |コピーアイテム-dest {"E:\ copyforbuild \" + $ _。BaseName +($ i ++)+ "。txt"} '。 ( 'Copy-Item'の目的地のようなタイプオブジェクトを取るパラメータを持つコマンドレットは、中括弧を使ってinbuilt for-eachを持っているので、ループが目的地を決定する必要はありません) – Richard

+0

Buddy、例外をスローします。 "Copy-Item:引数がPathであるため、パラメータをPathにバインドできません。" – Samselvaprabu

+0

$ File = Get-ChildItem -Path "V:\ MyFolder \\ *。*" -Filter CopyForbuild.bat -Rururse $ i = 1 Foreach($ f )$ファイルの { コピー項目$ f.FullName( "E:\ copyforbuild \" "TXT" + $ f.BaseName + $ I +) $ iが ++}私は*」を削除していた場合 – Samselvaprabu

関連する問題