Tentando passar variáveis para argumentos Send-MailMessage e falhando miseravelmente

2

Então eu tenho um problema.

Estou tentando escrever um script que faça uma lista de nomes de host em um arquivo .txt externo e envie um alerta por e-mail se um deles ficar inativo. Estou tendo alguns problemas com isso, mas o principal agora é que não consigo encontrar uma maneira de inserir uma variável na linha de assunto ou no corpo da mensagem. O código que estou usando para enviar para o alerta por e-mail agora é assim:

send-mailmessage -to "$alertRecipient" -from "$alertSender" -subject "$alertSubject" -body "$alertBody" -smtpServer "$smtpServer"

Agora, usei muitos valores de variáveis nesse comando e todos eles funcionam de alguma forma. Estou olhando principalmente para $alertSubject e $alertBody . Os valores de ambas as variáveis são extraídos de outro arquivo .txt e são ambos iguais a “$ selHost is offline!”.

$selHost é a variável que eu uso no script para ser igual ao nome do host em que o script está trabalhando a qualquer momento. Se eu usar write-host $selHost em praticamente qualquer lugar no script, receberei algo como "SomeComputerName" ou "192.168.1.123" e seu valor será alterado toda vez que o script alternar para o próximo host.

Eu quero que o valor literal de $selHost esteja no corpo da mensagem do alerta quando ele for enviado, mas da maneira como eu o escrevi, quando o alerta for enviado, ele simplesmente diz "$ selHost está off-line!" dando-me um nível completamente insensível de percepção da natureza do problema potencial.

Pastebin link do meu script como ele é agora.

Comando

Send-Mail-Message na linha 30, $selHost definido na linha 23, $alertSubject definido na linha 10, $alertBody definido na linha 12.

TL; DR: Eu quero incorporar o valor de uma variável nos argumentos do comando Send-MailMessage , mas estou apenas começando o nome da variável e não sei o que fazer .

    
por Catatonic27 26.06.2015 / 16:55

2 respostas

1

Então, se eu estou lendo o script (e entendendo sua descrição) corretamente, você tem duas variáveis, $alertSubject e $selHost

Ambas as variáveis são preenchidas com arquivos de texto (config.txt e hosts.txt, respectivamente).

Estou assumindo que a linha do config.txt que termina na variável de assunto é literalmente digitada como: $ selHost está off-line!

O problema é que, quando o PowerShell lê esse arquivo, ele trata a string como, literalmente, uma string. Não há Varibale Expansion acontecendo lá.

Você tem duas opções para resolver isso facilmente:

Opção 1: declare o assunto depois de obter o nome do host

Você poderia fazer algo assim:

$selHost = (GET-CONTENT $runPath\hosts.txt)[$it]
$alertSubject = "$selHost is offline!"

Isso expandiria a variável e você acabaria com a saída esperada.

Como alternativa, se você ainda deseja obter a maior parte do assunto do seu arquivo config.txt, sugiro alterá-lo de "$ selHost is offline!" para "está offline!" (observe o espaço no começo.)

Você pode escrever como:

$alertSubject = (get-content $runPath\config.txt)[1] # You can leave this on line 10
# ...
$selHost = (GET-CONTENT $runPath\hosts.txt)[$it]
$alertSubjectSend = $selHost + $alertSubject # Use this 'send' variable in the Send-MailMessage cmdlet call

Isso combinará as duas strings em uma.

Opção 2: use o método replace

Send-MailMessage -To $alertRecipient -From $alertSender -Subject ($alertSubject.Repalce('$selHost', $selHost)) -Body $alertBody -SmtpServer $smtpServer

Em foco mais próximo: -Subject ($alertSubject.Repalce('$selHost', $selHost))

Perceba que estamos buscando substituir '$selHost' (o literal string , as aspas simples são importantes para que a variável não seja expandida). Queremos substituí-lo por $selHost (o valor armazenado na variável, sem aspas, para que ele se expanda, embora você possa usar aspas duplas, se quiser).

A coisa toda é colocada entre colchetes, para que esse pequeno chunck seja avaliado primeiro e o resultado seja passado para o cmdlet.

Você também pode optar por salvá-lo em uma variável temporária; método também:

$alertSubjectSend = $alertSubject.Repalce('$selHost', $selHost)
    
por 02.07.2015 / 03:21
1

isto é o que eu uso em um dos meus scripts. Tente tirar as variáveis das cotações.

Send-MailMessage -From $From -To $To -Subject $Subject -SmtpServer $SMTPServer -BodyAsHtml

Além disso, qual versão do powershell você está executando, já que o Send-MailMessage é v2 e superior.

$PSVersionTable.PSVersion
    
por 29.06.2015 / 03:50