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

PowerShell中If条件变量比较失效,邮件发送逻辑未触发求助

问题排查与修正方案

我帮你梳理了这段PowerShell代码里的几个关键问题,这些就是导致逻辑无法正常运行的核心原因,咱们一步步拆解修正:

1. 文件大小获取方式完全错误

你用Format-Wide来处理文件大小,这玩意儿是用来给输出做格式化排版的,返回的是一堆显示用的对象,根本不是你要的纯数值文件大小!正确的做法应该直接提取文件的Length属性值:

原错误代码片段:

$filesize = Get-ChildItem $filename | Select-Object Length | Format-Wide

修正成这样:

# 直接获取单个文件的大小数值(确保$filename指向单个文件)
$filesize = (Get-ChildItem $filename -First 1).Length

如果$filename可能匹配多个文件,记得加-First 1指定取第一个,或者提前确认路径只指向单个文件。

2. 错误使用字符串比较而非数值比较

你把$filesize和$num都用双引号包起来做比较,这会触发字符串字典序比较,完全不是你要的数值大小判断!举个例子:数值10000明明比1265大,但字符串"10000"会被判定为小于"1265"——因为第二个字符0比2小,这逻辑完全反了。

原错误判断:

if("$filesize" -gt "$num") { ... }

改成直接用数值比较:

if($filesize -gt $num) { ... }

3. 冗余的无效代码

你写了$num=1265之后又单独加了一行$num,这行啥用没有,纯粹是多余的,直接删掉就行。

4. 未完成的附件代码

你代码里的$attachment = new-obj...没写完,完整创建邮件附件的写法应该是这样的(替换成你的实际附件路径):

$attachment = New-Object System.Net.Mail.Attachment("C:\你的附件路径\文件名.ext")

完整修正后的可运行示例代码

# 先确保$filename是你要检查的有效文件路径
$filename = "C:\示例路径\你的文件.txt"
$num = 1265

# 先检查文件是否存在,避免报错
if(-not (Test-Path $filename)) {
    Write-Host "错误:指定的文件不存在 -> $filename"
    exit
}

# 获取文件大小数值
$filesize = (Get-ChildItem $filename -First 1).Length

if($filesize -gt $num) {
    # 邮件配置
    $SMTPServer = "10.20.19.94"
    $SMTPPort = 25
    $username = "vcenter@somosadc.com"
    $to = "jeevan.m2@hcl.com"
    $subject = "VM Snapshot Report"
    $body = "检测到文件大小超过阈值,当前大小:$filesize 字节"

    # 创建邮件对象
    $mailMessage = New-Object System.Net.Mail.MailMessage
    $mailMessage.From = $username
    $mailMessage.To.Add($to)
    $mailMessage.Subject = $subject
    $mailMessage.Body = $body

    # 如果需要添加附件,取消注释下面两行并替换路径
    # $attachment = New-Object System.Net.Mail.Attachment("C:\你的附件路径\report.txt")
    # $mailMessage.Attachments.Add($attachment)

    # 配置SMTP客户端
    $smtpClient = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
    # 如果你的SMTP服务器需要认证,取消注释下面一行并填写密码
    # $smtpClient.Credentials = New-Object System.Net.NetworkCredential($username, "你的邮箱密码")
    # 如果需要SSL加密,添加这行
    # $smtpClient.EnableSsl = $true

    # 发送邮件并处理错误
    try {
        $smtpClient.Send($mailMessage)
        Write-Host "邮件已成功发送给 $to"
    }
    catch {
        Write-Host "邮件发送失败:$_"
    }

    # 清理资源
    $mailMessage.Dispose()
    # 如果用了附件,也要清理
    # $attachment.Dispose()
}
else {
    Write-Host "文件大小未超过阈值,当前大小:$filesize 字节"
}

额外小贴士

  • 一定要确认$filename变量已经正确赋值,不然Get-ChildItem会直接报错
  • 如果你的SMTP服务器有特殊要求(比如SSL、端口不是25),记得对应调整代码里的配置
  • 添加文件存在检查能避免很多不必要的报错,让脚本更健壮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:43