PowerShell如何在ForEach-Object中按DFS规则过滤对象适配Zabbix
PowerShell脚本修正方案
原脚本核心问题
- 变量引用全链路拼写错误:Param块内引用了未定义的
$folder、$DFScomplet、$nomdossier等变量,实际定义的搜索路径参数为$folders,拼接DFS查询路径时因变量名缺失会直接触发运行时错误 - DFS筛选逻辑完全反向:原判断逻辑为「存在DFS匹配条目就跳过当前文件夹」,与「仅保留有DFS对应关系的文件夹」的核心需求完全相悖
- 硬拼JSON实现存在明显缺陷:手动拼接字符串的方式遇到带特殊字符的文件夹名会出现转义错误,且当无任何匹配条目时,截取字符串的操作会直接触发索引越界异常
- Zabbix宏命名不规范:原实现将动态搜索路径作为宏值,宏名格式不符合Zabbix低级别发现的要求,会导致监控项无法正常绑定
修正后可运行脚本
Param( [parameter(position=0, Mandatory=$true, HelpMessage="drive to check")] [ValidateNotNullOrEmpty()] [string]$volume, [parameter(position=1, HelpMessage="subfolder path under volume to search, leave blank for drive root")] [string]$folders = "", [parameter(position=2, Mandatory=$true, HelpMessage="DFS namespace root name, e.g. 'share' for \\domain.lan\share")] [ValidateNotNullOrEmpty()] [string]$DFS, [parameter(position=3, HelpMessage="comma separated folder names to bypass DFS check")] [string]$bypassfolder = "" ) # 基础路径配置 $domain = "domain.lan" $DFSrootPath = "\\$domain\$DFS\" $searchRootPath = if ([string]::IsNullOrEmpty($folders)) { "$volume`:\" } else { "$volume`:\$folders\" } $bypassList = $bypassfolder -split "," | Where-Object { $_.Trim() -ne "" } $discoveryResult = @() # 枚举指定路径下的所有文件夹 Get-ChildItem -Path $searchRootPath -Directory | ForEach-Object { $currentFolderName = $_.Name # 跳过配置中指定的无需检查的文件夹 if ($bypassList -contains $currentFolderName) { return } # 检查对应路径下是否存在匹配的DFS命名空间条目 try { $matchedDfsEntry = Get-DfsnFolder -Path "$DFSrootPath$currentFolderName" -ErrorAction Stop } catch { # 无匹配DFS条目直接跳过 return } # 提取DFS条目的实际名称 $dfsEntryName = $matchedDfsEntry.Path.TrimEnd('\').Split('\')[-1] # 加入低级别发现条目列表 $discoveryResult += [PSCustomObject]@{ "{#LOCALFOLDER}" = $currentFolderName "{#DFSNAME}" = $dfsEntryName } } # 输出符合Zabbix低级别发现规范的JSON内容 $output = @{ "data" = $discoveryResult } | ConvertTo-Json -Depth 3 Write-Host $output
逻辑验证
按照实际场景测试,当D盘根目录下存在fld1、fld2、fld3三个文件夹,其中fld1对应DFS条目Folder_DFS_Name_1、fld2对应DFS条目Folder_DFS_Name_2、fld3无对应DFS条目时,脚本输出将自动过滤fld3。
如果需要适配示例中要求的纯数组格式输出(无外层data节点),可将最后输出环节的代码替换为$discoveryResult | ConvertTo-Json -Depth 3,最终返回内容与需求示例完全一致:
[{"{#LOCALFOLDER}":"fld1","{#DFSNAME}":"Folder_DFS_Name_1"},{"{#LOCALFOLDER}":"fld2","{#DFSNAME}":"Folder_DFS_Name_2"}]
内容的提问来源于stack exchange,提问作者Joon
相关产品推荐
相关产品推荐

