PowerShell脚本复制指定文件类型失效,如何仅复制.dat与.py文件并保留目录结构?
修复PowerShell脚本仅复制指定类型文件并保留空文件夹
这个问题其实是PowerShell中Copy-Item的-Include参数在管道场景下的常见陷阱——我来帮你拆解并修复:
问题根源
当你把Get-ChildItem的结果管道到Copy-Item时,-Include参数只会过滤管道传递过来的顶层项,而不会作用于递归过程中遍历到的子目录文件。所以你的脚本虽然加了-Include,但只是过滤了源目录下的顶层文件/目录,子目录里的所有文件还是会被完整复制。
解决方案1:直接使用Copy-Item(更简洁)
不需要先调用Get-ChildItem,直接给Copy-Item指定源路径为$sourceDir\*,这样-Include就能正确作用于所有递归的文件:
$sourceDir = "C:\User\001" $targetDir = "C:\User\002" Copy-Item -Path "$sourceDir\*" -Destination $targetDir -Recurse -Include '*.dat', '*.py' -Container
关键说明:
$sourceDir\*表示匹配源目录下的所有内容(文件和目录),这是让-Include在递归场景生效的关键-Container参数确保空文件夹会被完整复制到目标目录-Recurse配合-Include会自动遍历所有子目录,只复制符合后缀的文件
解决方案2:分步骤复制目录和文件(更灵活)
如果需要更精细的控制,可以先单独复制所有目录结构(包括空文件夹),再复制指定类型的文件:
$sourceDir = "C:\User\001" $targetDir = "C:\User\002" # 第一步:复制所有目录结构(保留空文件夹) Get-ChildItem -Path $sourceDir -Directory -Recurse | Copy-Item -Destination { Join-Path $targetDir $_.FullName.Substring($sourceDir.Length) } -Container # 第二步:仅复制指定类型的文件 Get-ChildItem -Path $sourceDir -File -Recurse -Include '*.dat', '*.py' | Copy-Item -Destination { Join-Path $targetDir $_.FullName.Substring($sourceDir.Length) }
关键说明:
-Directory参数只获取目录,确保完整复制源目录的层级结构(包括空目录)-File参数配合-Include精准筛选需要复制的文件类型- 用脚本块
{ Join-Path ... }动态计算每个项在目标目录的对应路径,保证结构一致
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

