PowerShell脚本问题:网络共享日志文件序列号批量匹配失效排查
PowerShell脚本修复:批量匹配网络共享中的擦除日志
原脚本存在三个核心问题,导致无法正常工作:
- 匹配规则错误:直接用序列号作为文件名筛选条件,只会匹配完全同名的文件,但需求是文件名包含序列号,需要添加通配符。
- 凭据未实际应用:获取了凭据但未在访问网络共享时使用,权限不足时会直接访问失败。
- 效率低下:循环中每次都递归遍历整个共享,重复IO操作会拖慢脚本运行速度。
修复后的脚本
# 获取访问网络共享的凭据 $cred = Get-Credential # 挂载网络共享并绑定凭据,避免权限问题 $driveConfig = @{ Name = 'EraseLogDrive' PSProvider = 'FileSystem' Root = '\\domain\share\share\' Credential = $cred ErrorAction = 'Stop' } New-PSDrive @driveConfig | Out-Null try { # 一次性拉取所有日志文件名,避免循环中重复遍历共享 $allLogNames = Get-ChildItem -Path 'EraseLogDrive:\' -File -Recurse -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name # 导入待匹配的序列号列表 $serialList = Import-Csv -Path 'C:\folder\Serials.csv' # 逐个匹配序列号并标记结果 foreach ($entry in $serialList) { # 检查是否存在文件名包含当前序列号的日志 $hasMatch = $allLogNames | Where-Object { $_ -like "*$($entry.Serial)*" } | Select-Object -First 1 $entry | Add-Member -MemberType NoteProperty -Name Present -Value ($null -ne $hasMatch) } # 导出匹配结果到CSV $serialList | Export-Csv -Path 'C:\folder\results.csv' -NoTypeInformation } finally { # 确保脚本结束后卸载挂载的驱动器,避免残留 Remove-PSDrive -Name 'EraseLogDrive' -ErrorAction SilentlyContinue }
关键修改说明
- 网络共享权限处理:通过
New-PSDrive挂载共享时传入凭据,确保访问网络路径时权限有效,解决无权限访问的问题。 - 匹配规则修正:使用
-like "*$($entry.Serial)*"模糊匹配文件名,只要文件名包含目标序列号即判定为存在。 - 性能优化:一次性获取所有日志文件名存入变量,后续匹配直接在内存中操作,避免多次遍历网络共享,大幅提升大文件夹下的运行效率。
- 资源清理:通过
try/finally块保证无论脚本成功还是失败,都会卸载挂载的网络驱动器,避免残留系统资源占用。
内容的提问来源于stack exchange,提问作者PConroy
相关产品推荐
相关产品推荐

