36

我正在努力让下面的脚本工作以正确结构(作为源服务器)复制文件夹和子文件夹中的文件。

可以说,下面提到了文件夹:

主文件夹:文件 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。

我希望将文件复制到各自的文件夹(如源文件夹)。任何进一步的帮助都将受到高度赞赏。

4

5 回答 5

86

这可以通过使用 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
于 2013-07-24T19:26:59.517 回答
3

如果您想将相同的内容从源镜像到目标,请尝试遵循一个。

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"
于 2017-07-05T16:12:29.727 回答
2

有一次我找到了这个脚本,这个复制文件夹和文件,并在目标中保持了相同的源结构,你可以用它做一些尝试。

# 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
}
于 2018-09-21T14:29:04.733 回答
1

我在最流行的答案(过度思考)上遇到了麻烦。它将 AFolder 放在 \Server\MyFolder\AFolder 中,我想要 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   
}
于 2019-10-09T19:46:34.433 回答
-1

我想要一个解决方案来复制在某个日期和时间之后修改的文件,这意味着我不需要使用通过过滤器管道传输的 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  
}
于 2013-10-22T09:13:06.787 回答