为何使用Move-Item向新目录移动时会合并首个目录?
问题说明
当调用带通配符的Move-Item命令移动内容到尚未存在的目录时,首个被移动的目录会被当作目标目录创建,导致该目录下的文件直接移入目标目录,而非创建对应的子目录,这一行为令人困惑。使用PowerShell 7.4.6.500版本,求解释该问题。
复现步骤
# 搭建测试环境 New-Item -ItemType "Directory" -Path "install\bin" New-Item -ItemType "File" -Path "install\bin\test.dll" New-Item -ItemType "Directory" -Path "install\lib" New-Item -ItemType "File" -Path "install\ReadMe.md" New-Item -ItemType "Directory" -Path "copy" # 执行移动命令 Move-Item -Path "install\*" -Destination "copy\app"
预期文件结构
copy\app\bin\test.dllcopy\app\lib\copy\app\ReadMe.md
实际文件结构
copy\app\test.dllcopy\app\lib\copy\app\ReadMe.md
原因解释
这是PowerShell的设计行为,核心逻辑如下:
当目标目录不存在时,Move-Item会优先处理通配符匹配到的第一个项目:
- 如果第一个匹配项是目录,PowerShell会直接将该目录重命名为指定的目标路径(即案例中的
copy\app),这就导致原目录下的文件直接出现在目标路径中。 - 后续匹配到的项目(
install\lib和ReadMe.md)会被直接移入已经创建好的copy\app目录下。
解决方法
要实现预期的目录结构,需先确保目标目录存在,再执行移动操作(目标路径末尾加\可明确指定为目录):
# 先创建目标目录 New-Item -ItemType Directory -Path "copy\app" -Force # 执行移动,末尾的\确保将源内容移入目标目录子级 Move-Item -Path "install\*" -Destination "copy\app\"
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

