You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell管道中创建对象以递归复制文件并保留目录结构

递归复制特定文件并保留目录结构的PowerShell命令修复方案

你原命令的核心问题是**Select-Object的用法错误**:当直接传入返回哈希表的脚本块时,PowerShell不会自动将哈希表转换为包含目标属性的自定义对象,而是将整个哈希表作为一个匿名属性的字符串化值返回,导致后续ForEach-Object中无法通过$_.src和$_.dst访问预期属性。

修正后的命令方案

推荐两种可行的修复方式:

方案1:正确使用Select-Object创建自定义对象

$baseDir = "你的目标目录绝对路径"
Get-ChildItem -Recurse -File *.csproj | 
  Resolve-Path -Relative | 
  Select-Object @{Name='src'; Expression={$_}}, 
                @{Name='dst'; Expression={[System.IO.Path]::Combine($baseDir, [System.IO.Path]::GetDirectoryName($_))}} |
  ForEach-Object {
    New-Item -ItemType Directory -Path $_.dst -Force | Out-Null
    Copy-Item -Path $_.src -Destination $_.dst
  }

方案2:简化流程,直接在ForEach-Object中处理(更高效)

$baseDir = "你的目标目录绝对路径"
Get-ChildItem -Recurse -File *.csproj | 
  ForEach-Object {
    $relativePath = $_.FullName | Resolve-Path -Relative
    $targetDir = [System.IO.Path]::Combine($baseDir, [System.IO.Path]::GetDirectoryName($relativePath))
    New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
    Copy-Item -Path $_.FullName -Destination $targetDir
  }

关键修正点说明

  • 规范自定义对象创建:方案1中使用Select-Object的哈希表语法(@{Name='属性名'; Expression={脚本块}}),明确指定属性名称和对应值,确保生成的对象包含可访问的src和dst属性。
  • 安全路径拼接:用[System.IO.Path]::Combine()替代直接字符串拼接,自动处理不同系统的路径分隔符,避免因路径格式错误导致的复制失败。
  • 可靠目录创建:New-Item -Force可自动创建多级目录,且不会因目标目录已存在抛出错误;| Out-Null用于屏蔽目录创建的冗余输出。
  • 流程简化:方案2跳过Select-Object环节,直接在遍历文件时完成路径计算与复制操作,减少管道步骤,提升执行效率。

内容的提问来源于stack exchange,提问作者dcg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:05:02