You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell变量看似相等但比较结果不等的问题求助

问题分析与修正方案

原脚本的核心问题

  1. 文件名提取逻辑错误

    • 直接对Get-ChildItem返回的数组调用.Split("_")会把所有文件的拆分结果合并成一个大数组,导致$split[1],$split[6],$split[11]不是对应文件的公共名称,而是随机位置的元素,完全不符合预期。
    • 正则表达式_.*\.*写法冗余且易出错,应该针对文件的固定格式精准匹配。
  2. 数组比较逻辑不符合预期
    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
}

关键修正说明

  1. 精准提取文件名

    • 遍历每个文件对象,直接操作$_.Name(仅文件名,不含路径),避免数组转换的潜在问题。
    • 用正则表达式针对固定格式匹配:
      • folder1文件用_QM_.*匹配后缀,确保名称含下划线时也能正确提取。
      • dwnld文件用^Batchfile_(.*?)_.*提取公共名称,比拆分更可靠,不受后续下划线数量影响。
  2. 正确比较集合
    使用Compare-Object工具:

    • 若两个集合完全一致,返回$null,-not $diff即为匹配。
    • 若存在差异,返回具体的差异元素,可直接加入邮件内容辅助排查。

内容的提问来源于stack exchange,提问作者Michael McIver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:45:28