我有三个目录: 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
,您希望 -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
会。
根据您的具体情况,这可能会按原样工作,但您可能必须对其进行更改。例如,如果某个目录以某种方式最终出现在 RFC 中,而该目录不在 SOURCE 中,那么它就不会捕捉到。如果这很重要,它也不会捕获 SOURCE 和 RFC 中的任何空目录。
PowerShell 可能不是这项工作的最佳工具,这取决于其他一些因素。据我了解,您有 Source
、RFC
和 Backup
文件夹。 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/