PowerShell脚本需求:仅移动指定类型文件(.mp3)
解决PowerShell仅移动MP3文件的问题
看起来你之前的脚本方向有点偏,咱们一步步理清楚问题所在,再给你几个靠谱的解决方案:
问题出在哪?
你原来的脚本里,Where-Object { $_.PSIsContainer -eq $true }是只筛选文件夹,根本没处理文件!所以后面加的扩展名筛选自然不起作用,而robocopy $_.FullName "E:\Music\Compressed"是把每个子文件夹里的所有内容都复制过去,这就是为什么非MP3文件也被移过去了。
另外你尝试用-include "*.JPG"时,路径写成了"E:\Downloads\*",这会导致-Include参数不生效——当-Path带有通配符时,-Include的筛选逻辑会变,所以得调整路径写法。
靠谱的解决方案
方案1:用Get-ChildItem + Move-Item(最直观)
直接筛选MP3文件然后移动,语法简单易懂:
Get-ChildItem -Path "E:\Downloads" -Recurse -Include "*.mp3" | Move-Item -Destination "E:\Music\Compressed"
注意这里-Path不要加*,保持"E:\Downloads",这样-Include "*.mp3"和-Recurse配合才能正确遍历所有子文件夹里的MP3文件。
方案2:用Where-Object手动筛选(更灵活)
如果需要更复杂的筛选逻辑,比如同时满足多个条件,可以用这个写法:
Get-ChildItem -Path "E:\Downloads" -Recurse | Where-Object { !$_.PSIsContainer -and $_.Extension -eq ".mp3" } | Move-Item -Destination "E:\Music\Compressed"
!$_.PSIsContainer:排除文件夹,只处理文件$_.Extension -eq ".mp3":只保留MP3格式的文件
方案3:用Robocopy(适合大量文件)
Robocopy是专门的文件复制/移动工具,处理大量文件时更稳定,还能显示进度。要移动MP3文件的话,用这个命令:
robocopy "E:\Downloads" "E:\Music\Compressed" *.mp3 /S /MOV
/S:遍历所有子文件夹(但不包括空文件夹)/MOV:移动文件(复制完成后删除源文件)
内容的提问来源于stack exchange,提问作者Hayden Walmsley
相关产品推荐
相关产品推荐

