使用PowerShell复制源服务器相同目录结构中的文件夹和子文件夹中的项目文件

5ssjco0h  于 2023-02-23  发布在  Shell
关注(0)|答案(6)|浏览(179)

我真的很难让下面的脚本工作复制文件夹和子文件夹在适当的结构(作为源服务器)。
比方说,有下面提到的文件夹:
主文件夹:文件aaa、文件bbb
子文件夹a:文件1、文件2、文件3
子文件夹b:文件4、文件5、文件6
使用的脚本:

Get-ChildItem -Path \\Server1\Test -recurse | ForEach-Object {
Copy-Item -LiteralPath $_.FullName -Destination \\server2\test |
Get-Acl -Path $_.FullName | Set-Acl -Path "\\server2\test\$(Split-Path -Path $_.FullName -Leaf)"

}

输出:文件aaa、文件bbb
子文件夹a(空文件夹)
子文件夹b(空文件夹)
文件1,文件2,文件3,文件4,文件5,文件6。
我想得到的文件复制到各自的文件夹(如源文件夹)。任何进一步的帮助是高度赞赏。

dffbzjpn

dffbzjpn1#

这可以用Copy-Item来完成,不需要用Get-Childitem,我想你想多了。

Copy-Item -Path C:\MyFolder -Destination \\Server\MyFolder -recurse -Force

我刚刚测试过,它对我很有效。

**编辑:***包括评论中的建议 *

# Add wildcard to source folder to ensure consistent behavior
Copy-Item -Path $sourceFolder\* -Destination $targetFolder -Recurse
g9icjywg

g9icjywg2#

如果要将相同内容从源镜像到目标,请尝试以下操作。

function CopyFilesToFolder ($fromFolder, $toFolder) {
    $childItems = Get-ChildItem $fromFolder
    $childItems | ForEach-Object {
         Copy-Item -Path $_.FullName -Destination $toFolder -Recurse -Force
    }
}

试验:

CopyFilesToFolder "C:\temp\q" "c:\temp\w"
pzfprimi

pzfprimi3#

有一次我发现这个脚本,这个复制文件夹和文件,并保持相同的结构,源在目的地,你可以做一些尝试与此。

# Find the source files
$sourceDir="X:\sourceFolder"

# Set the target file
$targetDir="Y:\Destfolder\"
Get-ChildItem $sourceDir -Include *.* -Recurse |  foreach {

    # Remove the original  root folder
    $split = $_.Fullname  -split '\\'
    $DestFile =  $split[1..($split.Length - 1)] -join '\' 

    # Build the new  destination file path
    $DestFile = $targetDir+$DestFile

    # Move-Item won't  create the folder structure so we have to 
    # create a blank file  and then overwrite it
    $null = New-Item -Path  $DestFile -Type File -Force
    Move-Item -Path  $_.FullName -Destination $DestFile -Force
}
ds97pgxw

ds97pgxw4#

我对最流行的答案(想太多了)有困难。它把一个文件夹放在\Server\MyFolder\AFolder中,而我想把一个文件夹和下面的内容放在MyFolder中。这不起作用。

Copy-Item -Verbose -Path C:\MyFolder\AFolder -Destination \\Server\MyFolder -recurse -Force

另外,我需要过滤,只复制 *.config文件。
使用“*”不起作用,因为它不递归

Copy-Item -Verbose -Path C:\MyFolder\AFolder\* -Filter *.config -Destination \\Server\MyFolder -recurse -Force

最后,我把路径字符串的开头剪掉,以获得相对于递归位置的childPath,这适用于所讨论的用例,并且可以访问许多子目录,而其他一些解决方案则不行。

Get-Childitem -Path "$($sourcePath)/**/*.config" -Recurse | 
ForEach-Object {
  $childPath = "$_".substring($sourcePath.length+1)
  $dest = "$($destPath)\$($childPath)" #this puts a \ between dest and child path
  Copy-Item -Verbose -Path $_ -Destination $dest -Force   
}
fykwrbwg

fykwrbwg5#

给你。

Function Backup-Files {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory)]
        [System.IO.FileInfo[]]$Source,
        [Parameter(Mandatory)]
        [String]$Destination
    )

    if (!(Test-Path $Destination)) {[void][System.IO.Directory]::CreateDirectory($Destination)}

    ForEach ($File in $Source) {
        $SourceRoot = $(Convert-Path $File.PSParentPath).split('\')[0]
        $NewFile    = $($File.FullName).Replace($SourceRoot,$Destination)
        $NewDir     = $($File.DirectoryName).Replace($SourceRoot,$Destination)
        [void][System.IO.Directory]::CreateDirectory($NewDir)
        Copy-Item -Path $File.FullName -Destination $NewFile -Force
    }
}

示例

<#
.SYNOPSIS
    Copy FileInfo object or array to a new destination while retaining the original directory structure.
.PARAMETER Source
    FileInfo object or array. (Get-Item/Get-ChildItem)
.PARAMETER Destination
    Path to backup source data to.
.NOTES
    Version (Date):             1.0 (2023-02-04)
    Author:                     Joshua Biddle (thebiddler@gmail.com)
    Purpose/Change:             Initial script development.
    Known Bugs:                 
.EXAMPLE
    Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Documents' -Recurse -Force -Exclude 'My Music','My Pictures','My Videos','desktop.ini' -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
.EXAMPLE
    Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Desktop' -Exclude "*.lnk","desktop.ini" -Recurse -Force -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
#>
cunj1qz1

cunj1qz16#

我想要一个解决方案来复制在某个日期和时间之后修改的文件,这意味着我不需要使用通过过滤器管道传输的Get-ChildItem。

$SourceFolder = "C:\Users\RCoode\Documents\Visual Studio 2010\Projects\MyProject"
$ArchiveFolder = "J:\Temp\Robin\Deploy\MyProject"
$ChangesStarted = New-Object System.DateTime(2013,10,16,11,0,0)
$IncludeFiles = ("*.vb","*.cs","*.aspx","*.js","*.css")

Get-ChildItem $SourceFolder -Recurse -Include $IncludeFiles | Where-Object {$_.LastWriteTime -gt $ChangesStarted} | ForEach-Object {
    $PathArray = $_.FullName.Replace($SourceFolder,"").ToString().Split('\') 

    $Folder = $ArchiveFolder

    for ($i=1; $i -lt $PathArray.length-1; $i++) {
        $Folder += "\" + $PathArray[$i]
        if (!(Test-Path $Folder)) {
            New-Item -ItemType directory -Path $Folder
        }
    }   
    $NewPath = Join-Path $ArchiveFolder $_.FullName.Replace($SourceFolder,"")

    Copy-Item $_.FullName -Destination $NewPath  
}

相关问题