2

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

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

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

请任何帮助将不胜感激。

$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,您希望-Destination成为c:\scripts\backup\subdir1\subdir2.

$_.FullName将是路径,$SOURCE_Folder因为它被用作-ReferenceObject. 它被逐字符串操作以创建所需的 RFC 和备份路径。使用[regex]::Escape静态方法是因为-replace运算符对字符串进行正则表达式操作,并且路径中的几个字符需要转义(主要是斜杠)。它所做的只是c:\scripts\source变成一个正则表达式转义版本:c:\\scripts\\source

使用该if构造是因为copy-Item不创建中间目录,但new-Item确实如此。

根据您的具体情况,这可能会按原样工作,但您可能必须对其进行更改。例如,如果某个目录可能以某种方式出现在不在 SOURCE 中的 RFC 中,那么这将无法捕捉到这一点。如果这很重要,它也不会捕获 SOURCE 和 RFC 中的任何空目录。


PowerShell 可能不是这项工作的最佳工具,这取决于其他一些因素。据我了解,您有Source,RFCBackup文件夹。该RFC文件夹将包含需要提交到的更改Source,但在执行之前您希望备份SourceBackup。如果它们之间的文件夹结构都相似,那么也许命令行工具ROBOCOPY可以满足您的需求?

如果我的一些假设是正确的,您首先将Source文件夹与Backup文件夹镜像。这将包含预先更改的文件。然后您将RFC文件夹镜像到Source,这会将任何更改的文件/文件夹提交RFCSource文件夹。一个例子(这是一个批处理文件):

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不在RFC.

浏览ROBOCOPY /?它的一些其他开关,如果你想构建一些审计功能,它有一些有趣的日志记录。另外,请务必在测试环境中进行测试。使用 /MIR 开关误用 ROBOCOPY 可能会让你成为一个非常悲伤的露营者。

于 2013-10-03T00:58:01.013 回答