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
相关产品推荐
相关产品推荐

