Powershell 将文件移动到父文件夹名称匹配的新位置 问题

Powershell 将文件移动到父文件夹名称匹配的新位置 问题,powershell,rollback,copy-item,Powershell,Rollback,Copy Item,我正在应用程序中使用回滚功能,将文件从备份/回滚目录复制到目标文件夹。听起来很简单,但这就是问题变得复杂的地方。由于所有文件共享相同或相似的名称,我使用父文件夹作为锚来帮助强制执行唯一位置 我想递归搜索一个目录,只要文件夹名称与对象的父目录匹配,就将对象的副本粘贴到该文件夹中,覆盖与该对象共享名称的任何文件 一种更直观的表示方法是: $Path = C:\Temp\MyBackups\Backup_03-14-2017 $destination = C:\SomeDirectory\Subfol

我正在应用程序中使用回滚功能,将文件从备份/回滚目录复制到目标文件夹。听起来很简单,但这就是问题变得复杂的地方。由于所有文件共享相同或相似的名称,我使用父文件夹作为锚来帮助强制执行唯一位置

我想递归搜索一个目录,只要文件夹名称与对象的父目录匹配,就将对象的副本粘贴到该文件夹中,覆盖与该对象共享名称的任何文件

一种更直观的表示方法是:

$Path = C:\Temp\MyBackups\Backup_03-14-2017
$destination = C:\SomeDirectory\Subfolder
$backups = GCI -Path "$Path\*.config" -Recursive

foreach ($backup in $backups) {
    Copy-Item -Path $backup -Destination $destination | Where-Object {
        ((Get-Item $backup).Directory.Name) -match "$destination\*"
    }
}
然而,以上这些都不起作用,我的研究也没有发现任何与我尝试做的事情有丝毫相似之处

问题:
是否有人知道如何使用PowerShell将项目从一个位置复制到另一个位置,其中复制项目的父文件夹与目标中的文件夹相匹配?

您可能考虑过了。如果您正在从网站备份web.config文件,我强烈建议使用SiteID作为备份文件夹。然后,当您想要回滚时,只需利用此方法查找要将web.config文件复制到的正确文件夹

理想情况下,在处理任何项目组(在本例中为网站)时,尝试为项目找到唯一标识符。SiteID非常适合于此

$Path = C:\Temp\MyBackups\Backup_03-14-2017  #In this directory store the web.config's in directories that match the SiteID of the site they belong to
#For example, if the site id was 5, then the full backup directory would be: C:\Temp\MyBackups\Backup_03-14-2017\5 
$backups = Get-ChildItem -Path $Path -Include *.config -Recurse

foreach ($backup in $backups) 
{
    $backupId = $backup.Directory.Name
    $destination = (Get-Website | where {$_.id -eq $backupId}).physicalPath

    Copy-Item -Path $backup -Destination $destination 
}

枚举备份文件,将源基本路径替换为目标基本路径,然后移动文件。如果只想替换现有文件,请测试目标是否存在:

Get-ChildItem -Path $Path -Filter '*.config' -Recursive | ForEach-Object {
    $dst = $_.FullName.Replace($Path, $destination)
    if (Test-Path -LiteralPath $dst) {
        Copy-Item -Path $_.FullName -Destination $dst -Force
    }
}
如果要还原目标中缺少的文件,请确保首先创建缺少的目录:

Get-ChildItem -Path $Path -Filter '*.config' -Recursive | ForEach-Object {
    $dst = $_.FullName.Replace($Path, $destination)
    $dir = [IO.Path]::GetDirectoryName($dst)
    if (-not (Test-Path -LiteralPath $dir -PathType Container)) {
        New-Item -Type Directory -Path $dir | Out-Null
    }
    Copy-Item -Path $_.FullName -Destination $dst -Force
}

你能给我一个关于文件和文件夹的简单例子吗?Ex01:要复制的项目的位置是
C:\Temp\MyBackups\FolderX\web.config
我想搜索的位置是
C:\MyApp\Source\SomeFolder\
。我希望将web.config还原到
C:\MyApp\Source\SomeFolder\FolderX\
,并覆盖FolderX中找到的任何现有web.config,原因之一是您无法在事后进行筛选(
Copy Item…| Where Object{…}
)。此外,备份目录的内容是否与目标目录的结构相似,即备份文件夹和目标文件夹内的相对路径是否相同?@AnsgarWiechers:是的,它们是相同的,这将非常有用,但我的问题涉及备份本地存储库而不是网站。哦!这很有道理。。。我真的想得太多了。谢谢你,安斯加