アップデート
TL;DR -- スクリプト
$RFC_Folder = 'c:\scripts\rfc'
$SOURCE_Folder = 'c:\scripts\source'
$BACKUP_Folder = 'c:\scripts\backup'
$rfc = get-ChildItem -File -Recurse -Path $RFC_Folder
$source = get-ChildItem -File -Recurse -Path $SOURCE_Folder
compare-Object -DifferenceObject $rfc -ReferenceObject $source -ExcludeDifferent -IncludeEqual -Property Name -PassThru | foreach-Object {
# copy SOURCE to BACKUP
$backup_dest = $_.DirectoryName -replace [regex]::Escape($SOURCE_Folder),$BACKUP_Folder
# create directory, including intermediate paths, if necessary
if ((test-Path -Path $backup_dest) -eq $false) { new-Item -ItemType Directory -Path $backup_dest | out-Null}
copy-Item -Force -Path $_.FullName -Destination $backup_dest
#copy RFC to SOURCE
$rfc_path = $_.fullname -replace [regex]::Escape($SOURCE_Folder),$RFC_Folder
copy-Item -Force -Path $rfc_path -Destination $_.FullName
}
説明:
以下のOPのコメントROBOCOPY
が好ましくないことを考慮して、回答を更新しました。
投稿されたスクリプトは基本的に正しい軌道に乗ってい$backup
ますが、使用する代わりに、パラメーターを少し工夫する必要があり-Destination
ます。ソースファイルが実際にあった場所に基づいて更新する-Destination
静的パスにしたくない。c:\scripts\backup
たとえば、ファイルが にあった場合はc:\scripts\source\subdir1\subdir2
、.-Destination
c:\scripts\backup\subdir1\subdir2
$_.FullName
$SOURCE_Folder
として使用されたので、 へのパスになります-ReferenceObject
。必要な RFC およびバックアップ パスを作成するために、文字列ごとに操作されています。演算子が文字列に対して正規表現操作を実行し、パス内のいくつかの文字をエスケープする必要がある[regex]::Escape
ため、静的メソッドが使用されています (主にスラッシュ)。正規表現をエスケープしたバージョンに変換するだけです-replace
。c:\scripts\source
c:\\scripts\\source
は中間ディレクトリを作成しないため、if
構成が使用されますが、作成されます。copy-Item
new-Item
詳細に応じて、これはそのまま機能する場合がありますが、変更する必要がある場合があります。たとえば、何らかの形でディレクトリが SOURCE にない RFC で終了する可能性がある場合、これはそれをキャッチしません。また、重要な場合、SOURCE および RFC にある空のディレクトリもキャッチしません。
他の要因によっては、PowerShell がこのジョブに最適なツールではない可能性があります。私が理解しているようにSource
、 、RFC
およびBackup
フォルダーがあります。RFC
フォルダには にコミットする必要がある変更が含まれますが、そのSource
前に にバックアップSource
する必要がありますBackup
。それらの間でフォルダー構造がすべて類似している場合、おそらくコマンドラインツールROBOCOPY
で必要なことを実行できますか?
私の仮定のいくつかが正しい場合は、最初にSource
フォルダーをフォルダーにミラーリングしBackup
ます。これには、変更前のファイルが含まれます。RFC
次に、フォルダをにミラーリングしますSource
。これにより、変更されたファイル/フォルダが からフォルダにコミットされRFC
ますSource
。例 (これはバッチ ファイルです):
REM Mirror the Source folder to Backup
ROBOCOPY C:\Scripts\Source C:\Scripts\Backup /MIR
REM Mirror the RFC folder to Source
ROBOCOPY C:\Scripts\RFC C:\Scripts\Source /MIR
このすべてが終了すると、フォルダーは、フォルダーがどのように見えるSource
かの正確なレプリカになります。が の完全なコピーではなく、部分的なコピーであるRFC
場合は、ミラー スイッチ を使用したくないでしょう。RFC
Source
/MIR
Source
RFC
他のスイッチのいくつかを参照しROBOCOPY /?
てください。監査機能を組み込みたい場合は、ロギング用の興味深いスイッチがいくつかあります。また、テスト環境でこれをテストしてください。/MIR スイッチを使用して ROBOCOPY を誤って使用すると、非常に悲しいキャンパーになる可能性があります。