Powershell move 文件但在替换之前备份文件

标签 powershell copy backup move powershell-3.0

我有三个目录: 1. 征求意见稿 2.来源 3.备份

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

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

如有任何帮助,我们将不胜感激。

$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
}

最佳答案

更新

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 的评论并不可取,我已经更新了答案。

您发布的脚本基本上是在正确的轨道上,但是您必须对 -Destination 参数有所了解,而不是仅使用 $backup。您不希望 -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 中不在 RFC 中的所有内容。

浏览 ROBOCOPY/? 了解它的一些其他开关,如果您想构建一些审计功能,它有一些有趣的用于日志记录。另外,请特别确保在测试环境中对此进行测试。滥用带有/MIR 开关的 ROBOCOPY 可能会让你成为一个非常悲伤的露营者。

关于Powershell move 文件但在替换之前备份文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140216/

相关文章:

powershell - 如何删除文件名的一部分?

c# - 在 .net 中使用应用公钥/私钥加密

linux - Windows Home Server 之类的 Ubuntu 远程备份软件

mysql - 将单个数据库分为事件数据库和存档数据库

c# - 如何将参数从 C# 程序传递给 powershell 脚本?

oracle - 通过 Powershell 向 Oracle 数据库插入数据时,为什么锐音符号会与其基本字母分开?

python - 全局列表不断变化,尽管复制

ios - 将 View Controller 从一个项目复制到另一个项目

c - Euler 22/按字母顺序对名称进行排序

javascript - 如何将过滤器批量添加到文件选择器?