【问题标题】:Powershell Copy folders and files while maintaining the folder hierarchyPowershell 复制文件夹和文件,同时保持文件夹层次结构
【发布时间】:2020-05-26 23:54:34
【问题描述】:

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

$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".

【问题讨论】:

    标签: powershell-3.0


    【解决方案1】:

    理想情况下,可以使用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 … }
      

      这避免了为您唯一的中间集合创建一个可能很大的数组 在下一个语句中使用?

    【讨论】:

    • 感谢您的评论。我没有使用 robocopy 的原因是我不允许在我的机器上安装它。我对您对单个管道的评论很感兴趣。您能否根据我的示例提供完整的代码,因为我是 Powershell 的新手,并且不太确定该放什么...... .
    • Robocopy 自 Vista/Windows Server 2008 以来一直是标准配置。如果您使用的是 PowerShell 3.0,则至少运行的是 Windows 7 或 Server 2008R2。这意味着您无需安装任何东西 - 您应该已经拥有它。
    • @user1476427:将省略号 () 替换为与代码中相同的参数。
    • 我没有意识到 Robocopy 在我的机器上。感谢大家的帮助。
    【解决方案2】:
    Copy-Item -Path \\Server\Example -Container -Destination D:\Example -Force -Recurse
    

    【讨论】:

      最近更新 更多