2

3 つのディレクトリがあります: 1. RFC 2. ソース 3. バックアップ

RFC には、ソース フォルダーで置き換える必要があるファイルとフォルダー (ファイルを含む) が含まれていますが、ファイルを置き換える/移動する前に、置き換えるファイルをソースからバックアップ フォルダーにバックアップする必要があります。

RFC とソースを比較してファイルをバックアップにコピーする次のコードを作成しましたが、サブディレクトリはコピーしません。ソースと同じフォルダー構造で、サブディレクトリ内のファイルも移動する必要があります。そして、ファイルのコピーが完了したら。RFC からソースにファイルを移動したいと考えています。

どんな助けでも大歓迎です。

$source = "C:\Scripts\Source\"
$backup = "C:\Scripts\Destination\"
$rfc_dir = "C:\Scripts\RFC000001234\"

$folder1Files=  dir $source
$folder2Files=  dir $rfc_dir

compare-object $folder1Files $folder2Files -property name -includeEqual -excludeDifferent | ForEach-object {
copy-item "$source\$($_.name)" -Destination "$backup" -Force -recurse
}
4

1 に答える 1

1

アップデート

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ため、静的メソッドが使用されています (主にスラッシュ)。正規表現をエスケープしたバージョンに変換するだけです-replacec:\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 を誤って使用すると、非常に悲しいキャンパーになる可能性があります。

于 2013-10-03T00:58:01.013 に答える