Команда Powershell возвращает ноль в случае успеха - PullRequest
0 голосов
/ 25 апреля 2018

Я пишу небольшие служебные скрипты в Powershell.Пытаясь следовать принципу «отлично выполнять одну работу для каждого сценария», я сталкиваюсь с проблемой с одним сценарием, который возвращает нулевое значение в случае успеха.Когда я пытаюсь выполнить команду и передать ее через такую ​​команду, как 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 голосов
/ 25 апреля 2018

Если указано, параметр 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, будет использоваться значение по умолчанию, которое не определено, а скорее является подробностью реализации и в этом примере пустым ( Send-MailMessage ). Поэтому не указывать Body - это то, что вы хотели бы сделать. Для обеспечения чистого кода вы можете использовать функции PowerShells splatting или альтернативно использовать простое ветвление с использованием операторов if.

Простой 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
}
0 голосов
/ 25 апреля 2018

Во-первых, электронные письма обычно используют UTF8, чтобы установить кодировку тела на 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 и эту Send-MailMessage в один скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...