Intentar pasar variables a los argumentos de Send-MailMessage y fallar miserablemente

2

Así que tengo un problema.

Estoy tratando de escribir una secuencia de comandos que haga ping a una lista de nombres de host en un archivo .txt externo, y enviar una alerta por correo electrónico si uno de ellos falla. Tengo algunos problemas con esto, pero el principal en este momento es que no puedo encontrar una manera de insertar una variable en la línea de asunto o el cuerpo del mensaje. El código que estoy usando para enviar una alerta por correo electrónico ahora se ve así:

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

Ahora, he usado muchos valores de variables en ese comando, y todos funcionan hasta cierto punto. Estoy mirando principalmente $alertSubject y $alertBody. Los valores de ambas de esas variables se extraen de otro archivo .txt y son iguales a "$ selHost is offline!".

$selHost es la variable que uso en el script para ser igual al nombre de host en el que está trabajando el script en un momento dado. Si lo hago write-host $selHost prácticamente en cualquier parte del script, obtendré algo como "SomeComputerName" o "192.168.1.123" y su valor cambia cada vez que el script cambia al siguiente host.

Quiero el valor literal de $selHost para estar en el cuerpo del mensaje de la alerta cuando se envía, pero tal como lo escribí, cuando se envía la alerta, simplemente dice "¡$ selHost está desconectado!", lo que me da un nivel completamente inútil de información sobre la naturaleza de El problema potencial.

Pastebin enlace de mi script como está ahora.

Send-Mail-Message comando en la línea 30, $selHost definido en la línea 23, $alertSubject definido en la línea 10, $alertBody Definido en la línea 12.

TL; DR: Quiero incrustar el valor de una variable en los argumentos de la Send-MailMessage comando, pero en lugar de eso solo obtengo el nombre de la variable y no sé qué hacer.

Catatonic27
fuente

Respuestas:

1

Entonces, si estoy leyendo el guión (y entiendo su descripción) correctamente, tiene dos variables, $alertSubject y $selHost

Ambas variables se completan con archivos de texto (config.txt y hosts.txt respectivamente).

Supongo que la línea del archivo config.txt que termina en la variable sujeto se escribe literalmente como: $ selHost está fuera de línea!

El problema es que cuando PowerShell lee ese archivo, trata la cadena como, literalmente, una cadena. No hay Varibale Expansión allí.

Tienes dos opciones para resolver esto fácilmente:

Opción 1: declarar el tema después de obtener el nombre de host

Podrías hacer algo como esto:

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

Esto expandiría la variable y terminaría con la salida que está esperando.

Alternativamente, si aún desea obtener la mayor parte del tema de su archivo config.txt, sugeriría cambiarlo de "$ selHost está desconectado!" a "está fuera de línea!" (note el espacio al inicio.)

Se puede escribir 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

Esto combinará las dos cadenas en una.

Opción 2: utilizar el método de reemplazo

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

En un enfoque más cercano: -Subject ($alertSubject.Repalce('$selHost', $selHost))

Aviso, estamos buscando para reemplazar '$selHost' (el literal cuerda , las comillas simples son importantes para que la variable no se expanda). Queremos reemplazarlo con $selHost (el valor almacenado en la variable, sin comillas, por lo que se expande, aunque podría usar comillas dobles si quisiera).

Todo está envuelto entre paréntesis, de modo que esa pequeña parte se evalúa primero y el resultado se pasa al cmdlet.

También puede ir con el 'guardarlo en una variable temporal; método también:

$alertSubjectSend = $alertSubject.Repalce('$selHost', $selHost)
Windos
fuente
1

esto es lo que uso en uno de mis scripts. Intenta sacar las variables de las comillas.

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

Además, ¿qué versión de powershell está ejecutando ya que creo que Send-MailMessage es v2 y superior?

$PSVersionTable.PSVersion
Andrew
fuente