2011-02-08 19 views
6

多数のファイルをバックアップフォルダにコピーする必要がありますが、相対パスを維持する必要があります。私は特定のファイルが必要です。すなわち相対パスを含むファイルをコピーする

C:\scripts\folder\File.ext1 
C:\scripts\folder2\file2.ext2 
C:\scripts\file3.ext1 

しかし、私はそうのようなEXT1ファイルをコピーする必要があります。

C:\backup\folder\File.ext1.bak 
C:\backup\file3.ext1.bak 

ソースパスは、複数の深さです。 これは私がファイルをコピーしなければならないものである:バックアップ\ \とパスのいずれかを取得するには表示されません。

$files = gci -path C:\scripts\ -recurse -include *.ext1 
$files | % { Copy-Item $_ "$($_).bak"; move-item $_ -destination C:\backup\ } 

これは単にCにすべてのファイルをダンプします。その部分がどのように行われるかわからない。

このような何かが、仕事ができる

答えて

6

gci -path C:\scripts\ -recurse -include *.ext1 | 
    % { Copy-Item $_.FullName "$($_.FullName).bak" 
     move-item $_.FullName -destination ($_.FullName -replace 'C:\\scripts\\','C:\backup\') } 

それは巧妙ではないが、それは汚い&迅速だと労力なしで動作します。

+1

...時間があるだろう、それは当然のrobocopyをうち

を新しく作成されたすべてのファイルの表示を提供します置き換え中の 'C:\ scripts \'のバックスラッシュを2倍にしたいかもしれません。それは正規表現です。 – mjolinor

+0

もちろん、thx。私はいつもそれを忘れています:) – stej

+0

これは仕事をするように見えます。私はそれを打ち、それが動作するかどうかをあなたに知らせます。 – MrGrant

1

あなたは、パスの作成を強制するためにあり、この

Clear-Host 
$from = "'C:\scripts\" 
$to = "'C:\backup\" 
$inc = @('*.ext1', '*.extx') 
$files = get-childItem -path $from -include $inc -Recurse 
$files | % {$dest = (Join-Path $to $($_.FullName+".bak").SubString($from.length)); $dum = New-Item -ItemType file $dest -Force; Copy-Item -Path $_ -Destination $dest -Recurse -Force } 

新アイテムを試すことができます。

ジャンポール

2

robocopyを使用してください。

robocopy c:\scripts c:\backup *.ext1 /s 

です。 .bak拡張も追加したいと思っていませんでした。私はまだその後、ファイルをコピーするRobocopyをを使用することをお勧めだと思います:

dir c:\backup -recurse -include *.ext1 | % { ren $_ "$_.bak" } 
+1

私はrobocopy yesでこれを行うことができましたが、私は純粋にpowershellでそれを行う方法があるかどうかを見たいと思っていました。 – MrGrant

3

絶対パスを返しますChildItemコマンドレットは-得るが、以下のように、あなたは現在の作業ディレクトリにそれらを相対することができます:

resolve-path -relative 

だから再帰的に先ディレクトリにカレントディレクトリからファイルのフィルタセットをコピーするには:

$dest = "c:\dest" 
$filter = "*.txt" 

get-childitem -recurse -include $filter | ` 
    where-object { !$_.PSIsContainer } | ` 
    resolve-path -relative | ` 
    % { $destFile = join-path $dest $_; new-item -type f $destFile -force | out-null; copy-item $_ $destFile; get-item $destfile; } 

新しい項目は、親ディレクトリを作成するために必要とされる

は、取得項目は、すべてこれを行いますが、あなたはもっと特別なフィルタリングやファイル名のマングリングをしたいとき

+0

'-File'フラグを' get-childitem'に渡すことができるので、 'where-object {!$ _。PSIsContainer}'を実行する必要はありません。 – Polymorphix

関連する問題