You need to enable JavaScript to run this app. PowerShell 5.1中Copy-Item -Recurse首次执行未识别新建en-US目录异常排查
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell 5.1中Copy-Item -Recurse首次执行未识别新建en-US目录异常排查

根本原因

这个问题和文件系统延迟、目录未刷新完全无关,是PowerShell 5.1 中 Copy-Item 当目标根目录不存在时的经典设计行为偏差:

  • 首次运行脚本时,目标路径 $modulepath\PoshCommence 是完全不存在的状态。此时执行 Get-ChildItem -Path $releasePath | Copy-Item -Destination $modulepath\PoshCommence -Recurse -Force,PowerShell 不会按照预期逻辑:先创建 PoshCommence 根目录,再把源路径下的文件、en-US 子目录的完整层级结构映射到目标路径下。
  • 实际触发的反直觉逻辑是:当 Copy-Item 检测到指定目标路径完全不存在时,会自动把这个不存在的路径判定为“所有待拷贝内容的最终平铺存放位置”。也就是说,它根本不会在目标侧保留源里的 en-US 目录层级,反而会把 en-US 目录里的所有文件直接展开放到指定的目标路径下,这就是帮助文档文件直接铺在模块根目录的原因。
  • 第二次运行脚本时逻辑正常,是因为上一次执行已经把 PoshCommence 根目录创建出来了,此时目标路径已经存在,Copy-Item 才会按照正常递归逻辑,在目标下创建对应的 en-US 子目录、保留完整层级。
为什么等待、加详细日志都无法解决问题

这个现象不是文件系统创建目录后的缓存延迟导致的,添加 Start-Sleep、添加 -Verbose 参数根本改变不了 Copy-Item 的判断逻辑,自然不会有效果。

修正方案
  • 拷贝前先显式强制创建目标模块根目录,从根源上规避触发 Copy-Item 的反直觉逻辑:
    New-Item -Path "$modulepath\PoshCommence" -ItemType Directory -Force | Out-Null
  • 调整拷贝命令,直接将 release 目录下的所有内容完整映射到目标路径,不要先经过 Get-ChildItem 中转:
    Copy-Item -Path "$releasePath\*" -Destination "$modulepath\PoshCommence" -Recurse -Force
    注意这里路径要加通配符 *,如果直接写 -Path $releasePath,会在目标模块目录下多嵌套一层 net472 的子目录,不符合 PowerShell 模块的目录结构规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 17:54:02