0

我编写了一个执行以下步骤的 Powershell 脚本。

  1. 它 RoboCopies 文件从服务器到外部硬盘驱动器(增量备份)
  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

我认为问题可能出在测试路径命令中。我会include $fileinclude $file.Name. 该include参数需要一个字符串,而不是一个对象。

并且为了代码的可维护性,我也将替换($result -like "False")(-not $result)。这是因为$result将包含一个布尔值($true$false),而不是一个字符串。

于 2012-09-30T01:45:17.540 回答