0

次の手順を実行する Powershell スクリプトを作成しました。

  1. サーバーから外付けハード ドライブにファイルをロボコピーします (増分バックアップ)
  2. 次回は、サーバー上でファイルが削除されたかどうかを確認することになっています。削除された場合は、それらのファイルをバックアップ フォルダーからバックアップ ハード ドライブの _DeletedFiles というフォルダーに移動します。
  3. /MIRを使用したRoboCopy(サーバー上で削除されたファイルもバックアップ上でも削除されます。_DeletedFilesフォルダーに既に保存されているため、問題ありません)

この _DeletedFiles フォルダーのポイントは、誰かがファイルを削除した場合でも、少なくとも 60 日間はどこかに保持したいということです。

このスクリプトは、ログ ファイルへの書き込み、パスのテスト、if ステートメントの最初の実行など、もう少し複雑です。

サーバー上で削除されたファイルをバックアップから新しいフォルダーにコピーする手順を除いて、すべてが機能しているようです。

この手順は次のようになります。

$testfolder = Test-Path "$UsbDisk\$backupFolder"  

        # If a Backup folder already exist then Compare files and see if any changes have been made
        if ( $testfolder -eq $true ) { #IF_2  

                    # Copy deleted files to BackUp Folder
                    MyLog "Check for Deleted Files on E:\" 0                  
                    $source = "E:\"
                    $sourcelist = Get-ChildItem $source -Recurse
                    $destination = "$UsbDisk\$backupFolder\Data_01\_DeletedFiles"

                    foreach ($file in $sourcelist){
                    $result = test-path -path "E:\*" -include $file
                        if ($result -like "False"){
                            Copy-Item $file -Destination "$destination"
                        }

                    }

                    # Start Synchronizing E:\
                    MyLog "Start Synchronizing E:\" 0
                    Robocopy "E:\" "$UsbDisk\$backupFolder\Data_01" /mir /r:2 /w:3 /M /XD VM_*

                    MyLog "E:\ is up to Date" 0

                    # Copy deleted files to BackUp Folder
                    MyLog "Check for Deleted Files on F:\" 0    
                    $source = "F:\"
                    $sourcelist = Get-ChildItem $source -Recurse
                    $destination = "$UsbDisk\$backupFolder\Data_02\_DeletedFiles"

                    foreach ($file in $sourcelist){
                    $result = test-path -path "F:\*" -include $file
                        if ($result -like "False"){
                            Copy-Item $file -Destination "$destination"
                            # Then Delete it from the BackUp
                        }

                    }

                    # Start Synchronizing F:\
                    MyLog "Start Synchronizing F:\" 0
                    Robocopy "F:\" "$UsbDisk\$backupFolder\Data_02" /mir /r:2 /w:3 /M /XD VM_*

                    MyLog "F:\ is up to Date" 0

        }

ファイルが宛先に存在しないため、ファイルをコピーできないというエラーが表示されます。ただし、そもそもコピーしてはならないファイルをコピーしようとします。

誰かがこれをよりエレガントに解決するアイデアを持っているか、または私のコードスニップを修正する方法を持っているのだろうか.

4

1 に答える 1

1

問題はtest-pathコマンドにあると思います。include $fileをに置き換えinclude $file.Nameます。includeパラメータは、オブジェクトではなく文字列を想定しています。

($result -like "False")そして、コードの保守性のために、私も)に置き換え(-not $resultます。これは、文字列ではなく$resultブール値($trueまたは)が含まれるためです。$false

于 2012-09-30T01:45:17.540 に答える