Powershell移动文件,但在替换之前备份文件

时间:2013-10-02 15:05:20

标签: powershell copy backup move powershell-v3.0

我有三个目录: 1. RFC 2.来源 3.备份

RFC包含我需要在源文件夹中替换的文件和文件夹(包含文件),但在我替换/移动文件之前,我需要备份我要从源文件替换到备份文件夹的文件。

我编写了以下代码,它比较RFC和Source并将文件复制到备份,但它不复制子目录。我希望它在子目录中移动文件以及与Source相同的文件夹结构。一旦完成文件的副本。我想将文件从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
}

1 个答案:

答案 0 :(得分:0)

更新

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\source转换为正则表达式转义版本:c:\\scripts\\source

使用if构造,因为copy-Item不会创建中间目录,但new-Item会这样做。

根据您的具体情况,这可能会按原样运行,但您可能需要更改它。例如,如果某个目录最终可能在RFC中不在SOURCE中,那么这将无法捕获。如果这很重要,它也不会捕获SOURCE和RFC中的任何空目录。


根据其他一些因素,PowerShell可能不是这项工作的最佳工具。据我了解,您有SourceRFCBackup个文件夹。 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中的任何内容{1}}不在RFC

浏览ROBOCOPY /?以寻找其他一些交换机,如果你想建立一些审计功能,它有一些有趣的日志记录。另外,请确保在测试环境中对此进行测试。使用/ MIR开关滥用ROBOCOPY可能会让你成为一个非常悲伤的露营者。