我在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
,在命令本身上,如果没有任何东西放在体内,就不会运行,没有在控制台中出现身体为空的错误。
答案 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
命令放入一个脚本中。