PowerShell批量删除cp.exe/cp.dll时如何排除指定文件夹
原脚本失效的核心原因
-Include传参格式错误:你把两个文件名写在了同一个字符串里"cp.exe, cp.dll",PowerShell会把它当成一个完整文件名去匹配,自然找不到任何cp.exe或cp.dll。多个匹配规则要拆成独立的数组元素,也就是写成"cp.exe","cp.dll"。-Exclude用法错误:这个参数默认只匹配文件/文件夹的名称,不支持匹配完整路径,你传入两个完整的目录路径根本不会触发排除逻辑;而且第二个排除路径末尾多了个多余空格,就算匹配名称也对不上。- 没有限定查找类型:递归查找时如果存在叫cp.exe或cp.dll的文件夹,会被一并匹配删除,存在误删风险。
修正后可直接使用的脚本
$SourceDirectory = "e:\cache\Agent03\2\s" # 定义需要保留cp文件的目标目录 $keepPaths = @( (Resolve-Path "e:\cache\Agent03\2\s\PS.Manager.Service").Path.ToLower(), (Resolve-Path "e:\cache\Agent03\2\s\PS.A.Service").Path.ToLower() ) Get-ChildItem -Path $SourceDirectory -File -Recurse -Force -Include "cp.exe","cp.dll" | Where-Object { $currentDir = $_.DirectoryName.ToLower() $needKeep = $false foreach ($keepDir in $keepPaths) { # 匹配保留目录本身及其所有子目录下的文件,不需要保留子目录文件的话删掉-or后面的判断即可 if ($currentDir -eq $keepDir -or $currentDir.StartsWith($keepDir + [IO.Path]::DirectorySeparatorChar)) { $needKeep = $true break } } -not $needKeep } | Remove-Item -Force -WhatIf
首次运行请保留
-WhatIf参数,此时PowerShell只会输出所有待删除的文件路径,不会实际执行删除。确认待删列表完全符合预期后,移除-WhatIf参数再运行即可完成清理。
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

