Powershell复制文件夹和文件,同时保持文件夹层次结构

时间:2013-10-14 14:10:34

标签: powershell-v3.0

我想将文件从一个位置复制到另一个位置,这些文件应与源文件夹在同一个文件夹中。当我使用以下脚本时,它会复制文件,但不会复制源文件夹中的文件夹。有什么建议吗?

$a=Get-ChildItem C:\temp\_pdf_list -recurse | Where-Object {$_.name -like "*pdf" -and $_.name -notlike "*prth*"}

$a

foreach($x in $a) {copy-item  -path $x.FullName "c:\temp\_pdfs_ck" -whatif} 

请注意,目标路径没有按照我需要的方式将文件放入名为1001的子文件夹中。

输出:

What if: Performing operation "Copy File" on Target "Item: C:\temp\_pdf_list\1001\10010001.pdf Destination: C:\temp\_pdfs_ck\10010001.pdf".

2 个答案:

答案 0 :(得分:0)

理想情况下,人们会使用像robocopy这样的工具,但我从来没有尝试同时兼容(在源文件夹和目标文件夹之后添加参数)和独占(/xf pattern)文件名匹配

要在PowerShell中执行此操作,您需要构建一个完整的输出路径:如果只向copy-item提供了目标文件夹,则提供源文件名,但不提供相对路径。

所以,比如:

$dest = $x.FullName.Replace('C:\temp\_pdf_list', 'c:\temp\_pdfs_ck')
copy-item -path $x.FullName -Destination $dest

注意:

  1. 我没有使用-replace运算符,因为它采用正则表达式,而正常的文件名字符(如\对正则表达式很重要。

  2. 为什么不在一个管道中执行所有操作:

    Get-ChildItem … | Where-Object … | Foreach-Object { $dest = …; Copy-Item … }
    

    这可以避免为中间集合创建一个可能很大的数组 在下一个陈述中使用?

答案 1 :(得分:0)

Copy-Item -Path \\Server\Example -Container -Destination D:\Example -Force -Recurse