Powershell命令在成功时返回null

时间:2018-04-25 17:42:09

标签: powershell

我在Powershell中编写小实用程序脚本。在尝试遵循每个脚本完成一项工作的原则时,我遇到了一个问题,即一个脚本在成功时返回null值。当我尝试运行命令并通过诸如Send-MailMessage之类的命令管道它时,我应该成功时出错。如果正文中有输出,我试图让Send-MailMessage只触发(否则,会有很多电子邮件进入)。

目前,我试图从Powershell命令行运行它:

Send-MailMessage -From "powershell@example.com" -To "tech@example.com" -Subject "Disk usage on $($env:COMPUTERNAME)" -SmtpServer "192.168.0.1" -Body (.\diskUsage.ps1 | Out-String) -ErrorAction Continue

我收到的错误:

Send-MailMessage : Cannot validate argument on parameter 'Body'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At line:1 char:156 + ... SmtpServer "192.168.0.1" -Body (.\diskUsage.ps1 | Out-String) -ErrorA ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessag

我的目标是远程运行命令到许多计算机,并且只在磁盘使用率高于阈值时才收到电子邮件通知。如果磁盘空间检查没问题,我的脚本当前不返回任何内容,这是我预期的行为。我需要Send-MailMessage,在命令本身上,如果没有任何东西放在体内,就不会运行,没有在控制台中出现身体为空的错误。

2 个答案:

答案 0 :(得分:1)

如果指定,将验证body参数是否为空或空。以下是PowerShell开源版本的正文部分:

/// <summary>
/// Specifies the body (content) of the message
/// </summary>
[Parameter(Position = 2)]
[ValidateNotNullOrEmpty]
public String Body
{
    get { return _body; }
    set
    {
        _body = value;
    }
}
private String _body;

请注意,如果未分配Body,则将使用未定义的默认值,而是实现细节,在此示例中为null(Send-MailMessage)。因此,不指定Body是您想要的内容。 为了确保代码清晰,您可以使用PowerShells splatting功能,或者使用if语句替代地使用简单分支。

简单如果

$diskUsage = (.\diskUsage.ps1 | Out-String)

If ($diskUsage){
    # Disk usage was set
    Send-MailMessage -From "powershell@example.com" -To "tech@example.com" -Subject "Disk usage on $($env:COMPUTERNAME)" -SmtpServer "192.168.0.1" -Body $diskUsage -ErrorAction Continue
} Else {
    # Disk usage was not set notice that -body is omitted which is different from setting it to null or empty
    Send-MailMessage -From "powershell@example.com" -To "tech@example.com" -Subject "Disk usage on $($env:COMPUTERNAME)" -SmtpServer "192.168.0.1" -ErrorAction Continue
}

答案 1 :(得分:0)

首先,电子邮件通常是UTF8,可以使用-Encoding UTF8

将正文的编码设置为diskUsage.ps1

如果您尝试捕获$output = & C:\path\to\diskUsage.ps1 | Out-String if([String]::IsNullOrEmpty($output)) { echo 'no string is being returned' } else { echo 'String returned' } 的输出,它可能不会像您想象的那样返回字符串。

您可以通过运行来测试它:

no string is being returned

如果显示diskUsage.ps1,那么您应该将此命令重新考虑到脚本中。

e.g。将Send-MailMessage和此mongod --repair命令放入一个脚本中。