PowerShell 5.1脚本:如何保留指定扩展名文件删除其余文件?
PowerShell 5.1 删除文件保留指定扩展名的问题解决
问题根源
你的脚本参数[string[]]$exceptions声明为字符串数组,但调用时传入的"*.zip, *.log"是单个字符串,PowerShell会将其作为数组的唯一元素。-Exclude参数需要的是多个独立的通配符字符串,而非包含逗号的单个字符串,导致匹配逻辑失效,出现全删或全保留的问题。
解决方案
方案1:修改调用方式,正确传递数组参数
无需修改脚本,调用时直接将多个例外项分开传递,PowerShell会自动识别为数组:
powershell -ExecutionPolicy Unrestricted -File "C:\scripts\deletefiles_custom.ps1" "C:\Test\" -exceptions "*.zip" "*.log"
如果例外项不含空格,也可以省略引号:
powershell -ExecutionPolicy Unrestricted -File "C:\scripts\deletefiles_custom.ps1" "C:\Test\" -exceptions *.zip *.log
方案2:修改脚本,支持逗号分隔的输入
若你习惯用逗号分隔的字符串传入例外项,可修改脚本将输入字符串拆分为数组:
param( [string]$folder, [string]$exceptions ) # 拆分逗号分隔的字符串,去除每个元素的空格 $excludeList = $exceptions -split ',' | ForEach-Object { $_.Trim() } # 仅删除文件(不删除子文件夹),递归处理 Get-ChildItem -Path $folder -File -Recurse -Exclude $excludeList | Remove-Item -Force
调用方式保持你原来的写法即可:
powershell -ExecutionPolicy Unrestricted -File "C:\scripts\deletefiles_custom.ps1" "C:\Test\" -exceptions "*.zip, *.log"
额外注意事项
原脚本中Remove-Item "$folder\*" -Recurse -Force会递归删除所有子文件夹及文件(除例外文件),如果你的需求是仅删除文件、保留子文件夹,建议使用Get-ChildItem -File先筛选文件再删除,如方案2中的写法。
内容的提问来源于stack exchange,提问作者Hobbes
相关产品推荐
相关产品推荐

