PowerShell变量看似相等但比较结果不等的问题求助
问题分析与修正方案
原脚本的核心问题
文件名提取逻辑错误
- 直接对
Get-ChildItem返回的数组调用.Split("_")会把所有文件的拆分结果合并成一个大数组,导致$split[1],$split[6],$split[11]不是对应文件的公共名称,而是随机位置的元素,完全不符合预期。 - 正则表达式
_.*\.*写法冗余且易出错,应该针对文件的固定格式精准匹配。
- 直接对
数组比较逻辑不符合预期
PowerShell中数组用-eq比较时,返回的是两个数组中匹配的元素,而非判断数组是否完全相等。即使元素顺序不同或数量不一致,也可能返回非空数组被判定为$true,导致判断逻辑失效。
修正后的脚本
# 提取folder1中所有文件的公共名称部分 $folder1Names = Get-ChildItem -Path C:\Temp\Data\folder1 | ForEach-Object { # 匹配_QM_之前的内容,精准提取公共名称(支持名称含下划线的场景) $_.Name -replace '_QM_.*' } # 提取dwnld文件夹中所有文件的公共名称部分 $dwnldNames = Get-ChildItem -Path C:\Temp\Data\dwnld | ForEach-Object { # 用正则精准提取Batchfile_之后、第一个下划线之前的内容,比拆分更可靠 $_.Name -replace '^Batchfile_(.*?)_.*', '$1' } # 比较两个名称集合是否完全一致 $diff = Compare-Object -ReferenceObject $folder1Names -DifferenceObject $dwnldNames if (-not $diff) { Send-MailMessage -To someone@domain.com -Subject "FTP Files" -From Admin@domain.com -Body "The FTP files match" -SmtpServer 10.0.0.xxx } else { # 把差异内容加入邮件,方便排查具体不匹配的文件 $diffDetails = $diff | Out-String Send-MailMessage -To someone@domain.com -Subject "FTP Files" -From Admin@domain.com -Body "The FTP files do not match. Differences:`n$diffDetails" -SmtpServer 10.0.0.xxx }
关键修正说明
精准提取文件名
- 遍历每个文件对象,直接操作
$_.Name(仅文件名,不含路径),避免数组转换的潜在问题。 - 用正则表达式针对固定格式匹配:
- folder1文件用
_QM_.*匹配后缀,确保名称含下划线时也能正确提取。 - dwnld文件用
^Batchfile_(.*?)_.*提取公共名称,比拆分更可靠,不受后续下划线数量影响。
- folder1文件用
- 遍历每个文件对象,直接操作
正确比较集合
使用Compare-Object工具:- 若两个集合完全一致,返回
$null,-not $diff即为匹配。 - 若存在差异,返回具体的差异元素,可直接加入邮件内容辅助排查。
- 若两个集合完全一致,返回
内容的提问来源于stack exchange,提问作者Michael McIver
相关产品推荐
相关产品推荐

