4

在我的内部系统上重复日志收集期间,发现递归 Copy-Item 调用的奇怪行为

说,我有一些文件的 C:\Source 和带有文件的子文件夹。我想将它递归地复制到 C:\Target。第一次所有源将递归复制到 C:\Target

当我第二次尝试将“C:\Source”复制到“C:\Target”时,就会出现问题。在这种情况下,“C:\Source”将被复制到“C:\Target\Source”

例如:

cls
if(Test-Path "C:\Target")
{
    Remove-Item "C:\Target"
}

Copy-Item "C:\Source" "C:\Target" -Force -Recurse | Out-Null
DIR "C:\Target" 
Write-Host "OK"
Write-Host " "
Write-Host " "

Copy-Item "C:\Source" "C:\Target" -Force -Recurse | Out-Null
DIR "C:\Target" 
Write-Host "Not OK"

脚本输出:

Directory: C:\Target


Mode                LastWriteTime     Length Name                                                          
----                -------------     ------ ----                                                          
d----         4/11/2016   3:45 PM            SampleSourceFolderLevel1                                      
-a---         4/11/2016   3:35 PM          0 SampleFileLevel0.txt                                          
OK


d----         4/11/2016   3:45 PM            SampleSourceFolderLevel1                                      
d----         4/11/2016   3:45 PM            Source                                                        
-a---         4/11/2016   3:35 PM          0 SampleFileLevel0.txt                                          
Not OK

知道如何让 Copy-Item 像这样工作

ROBOCOPY $sourceLog $targetLog /E | Out-Null 

??

提前致谢

脚本输出

4

2 回答 2

4

好像你想复制c:\Source. 您只需要添加\*

Copy-Item -Path "C:\Source\*" -Destination "C:\Target" -Force -Recurse | Out-Null

它适用于第一次运行,因为您删除了目标文件夹,并且 cmdlet 现在将该文件夹复制C:\SourceC:\Target. 如果C:\Target存在,cmdlet 会将源复制目标文件夹中。

于 2016-04-11T13:01:22.410 回答
0

Copy-Item基于目的地是否存在的事实具有不一致的行为。

如果您想获得一致的复制体验,请使用以下模式:

$copyFrom = 'C:\Foo\Bar\TargetDirectoryToCopy'
$destinationPath = 'D:\Bar\Foo\'

$newItemParams = @{
    Path        = $destinationPath
    ItemType    = 'Directory'
    Force       = $True
}

$copyParams = @{
    Path        = $copyFrom
    Destination = $destinationPath
    Recurse     = $True
    Confirm     = $false
    Force       = $True
}
New-Item @newItemParams
Copy-Item @copyParams

结果

该目录D:\Bar\Foo\将有TargetDirectoryToCopy目录嵌套在里面。

因此,如果有一个文件C:\Foo\Bar\TargetDirectoryToCopy\FooBar.txt,它的副本将D:\Bar\Foo\TargetDirectoryToCopy\FooBar.txt与其中的任何其他文件一起创建C:\Foo\Bar\TargetDirectoryToCopy

于 2021-02-19T14:04:32.573 回答