当第二次运行时,Copy-Item会将文件夹复制到目标文件夹中。

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 

??

Thanks in advance

Script output

2个回答

4

看起来你想复制 c:\Source 的内容。你只需要添加 \*

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

第一次运行是可以工作的,因为您删除了目标文件夹,Cmdlet现在将文件夹C:\Source复制到C:\Target。如果C:\Target已存在,该Cmdlet将把源文件复制到目标文件夹中。


不幸的是,这只复制了 C:\Source 的第一级文件项。如果它有一个子文件夹 C:\Source\Subfolder,它将不会被复制。 - Max Shlain
谢谢,@jisaak。我看到这个代码可以第二次运行,但是第一次还不太好用 : )。你知道如何在不创建目标文件夹的情况下解决这个问题吗?[链接] (http://i.imgur.com/BXgA75j.png) - Max Shlain
最简单的解决方案是使用 md 'C:\Target' -Force | out-null 确保文件夹存在。 - Martin Brandl
谢谢,@jisaak。这就是我所采用的解决方案。另一个选择是使用robocopy。我只是想知道是否有办法从Copy-Item中获得一致的行为。 - Max Shlain

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中的任何其他文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接