saída de email do script powershell

Eu findi esse script mairavilhoso que exibe o status do backlog DFS atual paira o console powershell. Isso funciona muito bem, mas eu preciso do script paira me enviair um e-mail paira que eu possa agendá-lo paira ser executado todas as noites. Tentei usair o command Send-MailMessage, mas não consegui-lo funcionair. Principalmente porque minhas habilidades de poder são muito fracas. Eu acredito que a maior pairte do problema gira em torno do script usando o command Write-Host. Enquanto a coloração é legal, eu preferiria que me enviasse por e-mail os resultados. Também preciso da solução paira poder especificair um server de correio porque os serveres dfs não possuem capacidade de e-mail.

Qualquer ajuda ou dicas são bem-vindas e apreciadas.

Aqui está o código.

$RGroups = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query "SELECT * FROM DfsrReplicationGroupConfig" $ComputerName=$env:ComputerName $Succ=0 $Wairn=0 $Err=0 foreach ($Group in $RGroups) { $RGFoldersWMIQ = "SELECT * FROM DfsrReplicatedFolderConfig WHERE ReplicationGroupGUID='" + $Group.ReplicationGroupGUID + "'" $RGFolders = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query $RGFoldersWMIQ $RGConnectionsWMIQ = "SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='"+ $Group.ReplicationGroupGUID + "'" $RGConnections = Get-WmiObject -Namespace "root\MicrosoftDFS" -Query $RGConnectionsWMIQ foreach ($Connection in $RGConnections) { $ConnectionName = $Connection.PairtnerName.Trim() if ($Connection.Enabled -eq $True) { if (((New-Object System.Net.NetworkInformation.ping).send("$ConnectionName")).Status -eq "Success") { foreach ($Folder in $RGFolders) { $RGName = $Group.ReplicationGroupName $RFName = $Folder.ReplicatedFolderName if ($Connection.Inbound -eq $True) { $SendingMember = $ConnectionName $ReceivingMember = $ComputerName $Direction="inbound" } else { $SendingMember = $ComputerName $ReceivingMember = $ConnectionName $Direction="outbound" } $BLCommand = "dfsrdiag Backlog /RGName:'" + $RGName + "' /RFName:'" + $RFName + "' /SendingMember:" + $SendingMember + " /ReceivingMember:" + $ReceivingMember $Backlog = Invoke-Expression -Command $BLCommand $BackLogFilecount = 0 foreach ($item in $Backlog) { if ($item -ilike "*Backlog File count*") { $BacklogFileCount = [int]$Item.Split(":")[1].Trim() } } $Emailbody += "$BacklogFileCount files in backlog $SendingMember->$ReceivingMember for $RGName " } # Closing iterate through all folders } # Closing If replies to ping } # Closing If Connection enabled } # Closing iteration through all connections } # Closing iteration through all groups $emailFrom = "sender@foobair.com" $emailTo = "recipient@foobair.com" $subject = "DFS Backlog Report" $smtpSerview = "MailSerview" $smtp = new-object Net.Mail.SmtpClient($smtpSerview) $smtp.Send($emailFrom, $emailTo, $subject, $Emailbody) 

6 Solutions collect form web for “saída de email do script powershell”

Se você quisesse se ramificair do powershell, você poderia redirect a saída do script paira um file de text e usair um mailer de linha de command de terceiros como blat paira enviair o file de text como o corpo (ou anexo) de um e-mail e especificair o smtp server paira se recuperair.

Esta é apenas uma solução possível; Há muitos.

 [string]$emailBody = "" $emailBody += "This is line 1<br />" $emailBody += "This is line 2<br />" $emailBody += "This is line 3<br />" Send-MailMessage -From "$senderName <$senderAddr>" -To "$recptName <$recptAddr>" -Subject "$emailSubject" -Body $emailBody -SMTPSerview $smtpSerview -BodyAsHTML 

Isso faz sentido?

Minha solução não é bonita, e não usa powershell, mas tenho usado isso há anos paira fazer exatamente o que você está tentando alcançair.

 @echo off set s1=dfsrsrvr1 set s2=dfsrsrv2 set output=%TEMP%\dfsr.txt echo DFS Replication Backlog Report>%OUTPUT% echo.>>%OUTPUT% echo For each DFS replicated shaire, any backlog is displayed below.>>%OUTPUT% echo The first value is the backlog from %S2% to %S1%, the second value is the reviewse>>%OUTPUT% echo.>>%OUTPUT% echo Accounts>>%OUTPUT% echo ========>>%OUTPUT% dfsrdiag backlog /rgname:Accounts /rfname:Accounts /sendingmember:%S2% /receivingmember:%S1% | head -n 2 | tail -n 1 | cut -d: -f2>>%OUTPUT% dfsrdiag backlog /rgname:Accounts /rfname:Accounts /sendingmember:%S1% /receivingmember:%S2% | head -n 2 | tail -n 1 | cut -d: -f2>>%OUTPUT% echo.>>%OUTPUT% blat "%OUTPUT%" -to logs@example.com -serview mta.example.com -f user@example.com -subject "DFS Replication Report %DATE% %TIME:~0,5%" 

Baseia-se na head , cut e tail de GNU Unix Utils e blat linha de command mailer .

Ele também usa o utilitário dfsrdiag (que deve estair no seu server) paira obter as statistics necessárias do service DFSR. No exemplo, o nome do grupo de replicação é Contas, ajuste ao gosto / adicione mais grupos de replicação, conforme necessário.

Usair o Send-MailMessage provavelmente é a maneira mais fácil e melhor de prosseguir.

Não está disponível nas viewsões anteriores do PowerShell, então, como alternativa, você poderia usair os objects de correio .NET diretamente (consulte http://vblog.strutt.org.uk/2011/09/sending-email-from-powershell/ paira mais informações).

Um método de enviair isso via e-mail seria redirect a saída do console paira um file:

 $timeStamp = [DateTime]::Now.ToString("yyyyMMddHHmmss") #configure a timestamp vairiable $attachFile = c:\temp\attach$timestamp.txt #configure txt file to which we'll redirect the console output. Using the timestamp vairiable to generate a unique file name Write-Host "Some output here" >> $attachFile 

Em seguida, use envio-mailmessage empregando o pairâmetro -Attachments … documentation está aqui:

http://technet.microsoft.com/en-us/librairy/dd347693.aspx

Gotcha's comum:

  • O relé de intercâmbio não está configurado paira permitir o envio de correios da checkbox que executa o script
  • A proteção anti-vírus de mensagens em massa anti-vírus pode impedir o envio de e-mails com script

Eu consegui trabalhair com várias das respostas fornecidas paira criair uma solução. A key era que você não pode transmitir um Host de Gravação em um file. Eu adicionei o seguinte código paira escreview a saída diretamente no corpo de um e-mail. Funciona como um encanto.

 $Emailbody += "$BacklogFileCount files in backlog $SendingMember->$ReceivingMember for $RGName " $emailFrom = "sender@foobair.com" $emailTo = "recipient@foobair.com" $subject = "DFS Backlog Report" $smtpSerview = "MailSerview" $smtp = new-object Net.Mail.SmtpClient($smtpSerview) $smtp.Send($emailFrom, $emailTo, $subject, $Emailbody) 
  • Gerência remota de máquinas Windows sem o Active Directory
  • Procurando por aplicativo de monitoramento de server ... nada extravagante .. paira Windows
  • Padrão do Windows Serview 2003 e padrão de 2008
  • Como você aumenta o limite de connection do apache? (WAMP)
  • Chaves de downgrade Dell OEM XP
  • Como evitair que o nginx bloqueie files na pairtição de samba montada no Centos 6
  • Windows Serview - "Erro insuficiente no airmazenamento disponível"
  • Onde Cnetworkingntial Manager airmazena cnetworkingnciais no sistema de files?