アップデート
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、.-Destinationc:\scripts\backup\subdir1\subdir2
$_.FullName$SOURCE_Folderとして使用されたので、 へのパスになります-ReferenceObject。必要な RFC およびバックアップ パスを作成するために、文字列ごとに操作されています。演算子が文字列に対して正規表現操作を実行し、パス内のいくつかの文字をエスケープする必要がある[regex]::Escapeため、静的メソッドが使用されています (主にスラッシュ)。正規表現をエスケープしたバージョンに変換するだけです-replace。c:\scripts\sourcec:\\scripts\\source
は中間ディレクトリを作成しないため、if構成が使用されますが、作成されます。copy-Itemnew-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場合は、ミラー スイッチ を使用したくないでしょう。RFCSource/MIRSourceRFC
他のスイッチのいくつかを参照しROBOCOPY /?てください。監査機能を組み込みたい場合は、ロギング用の興味深いスイッチがいくつかあります。また、テスト環境でこれをテストしてください。/MIR スイッチを使用して ROBOCOPY を誤って使用すると、非常に悲しいキャンパーになる可能性があります。