2011-11-16 4 views
4

J'essaie d'envoyer un e-mail avec une fonction powershell en utilisant le cmdlet send-mailmessage. Je dois modifier l'encodage du texte. La cmdlet send-mailmessage a un paramètre "encoding" qui utilise la classe System.Text.Encoding. donc je dois utiliser quelque chose comme ceci:Encodage de messagerie PowerShell

Send-Mailmessage -Encoding ([System.Text.Encoding]::UTF8) 

Je voudrais utiliser -Encoding UTF8 à la place. La cmdlet Out-File fonctionne comme ceci. Comment puis-je reproduire le comportement à partir de la cmdlet Out-File?

C'est mon idée, mais je trouve un peu circonstancielle:

[parameter()][ValidateSet("UTF8","Unicode","ASCII")][String]$Encoding 

Avec cela, je créer l'encodage en conséquence.

[System.Text.Encoding]::$Encoding 

Répondre

2

Vous pouvez créer une fonction proxy, modifiez le type du paramètre de codage à System.String et de le manipuler dans le bloc Begin. J'ai inclus cet exemple dans le module PowerShell Proxy Extensions.

function Send-MailMessage 
{ 
    [CmdletBinding()] 

    param(
     [Parameter(ValueFromPipeline=$true)] 
     [Alias('PsPath')] 
     [ValidateNotNullOrEmpty()] 
     [System.String[]] 
     ${Attachments}, 

     [ValidateNotNullOrEmpty()] 
     [System.String[]] 
     ${Bcc}, 

     [Parameter(Position=2)] 
     [ValidateNotNullOrEmpty()] 
     [System.String] 
     ${Body}, 

     [Alias('BAH')] 
     [Switch] 
     ${BodyAsHtml}, 

     [Parameter()] 
     [ValidateSet('ASCII','UTF8','UTF7','UTF32','Unicode','BigEndianUnicode','Default','OEM')] 
     [ValidateNotNullOrEmpty()] 
     [Alias('BE')] 
     [System.String] 
     $Encoding, 

     [ValidateNotNullOrEmpty()] 
     [System.String[]] 
     ${Cc}, 

     [Alias('DNO')] 
     [ValidateNotNullOrEmpty()] 
     [System.Net.Mail.DeliveryNotificationOptions] 
     ${DeliveryNotificationOption}, 

     [Parameter(Mandatory=$true)] 
     [ValidateNotNullOrEmpty()] 
     [System.String] 
     ${From}, 

     [Parameter(Position=3)] 
     [Alias('ComputerName')] 
     [ValidateNotNullOrEmpty()] 
     [System.String] 
     ${SmtpServer}, 

     [ValidateNotNullOrEmpty()] 
     [System.Net.Mail.MailPriority] 
     ${Priority}, 

     [Parameter(Mandatory=$true, Position=1)] 
     [Alias('sub')] 
     [ValidateNotNullOrEmpty()] 
     [System.String] 
     ${Subject}, 

     [Parameter(Mandatory=$true, Position=0)] 
     [ValidateNotNullOrEmpty()] 
     [System.String[]] 
     ${To}, 

     [ValidateNotNullOrEmpty()] 
     [System.Management.Automation.PSCredential] 
     ${Credential}, 

     [Switch] 
     ${UseSsl} 
    ) 


    begin 
    { 
     try 
     { 
      $outBuffer = $null 
      if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) 
      { 
       $PSBoundParameters['OutBuffer'] = 1 
      } 

      if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Encoding')) 
      { 
       $null = $PSCmdlet.MyInvocation.BoundParameters.Remove('Encoding') 
       $newValue = & { 
        if ($Encoding -eq 'OEM') 
        { 
         [System.Text.Encoding]::GetEncoding($Host.CurrentCulture.TextInfo.OEMCodePage) 
        } 
        else 
        { 
         [System.Text.Encoding]::$Encoding 
        } 
       } 

       $null = $PSCmdlet.MyInvocation.BoundParameters.Add('Encoding',$newValue) 
      } 


      $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Send-MailMessage', [System.Management.Automation.CommandTypes]::Cmdlet) 
      $scriptCmd = {& $wrappedCmd @PSBoundParameters } 
      $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) 
      $steppablePipeline.Begin($PSCmdlet) 
     } 
     catch 
     { 
      throw 
     } 
    } 

    process 
    { 
     try 
     { 
      $steppablePipeline.Process($_) 
     } 
     catch 
     { 
      throw 
     } 
    } 

    end 
    { 
     try 
     { 
      $steppablePipeline.End() 
     } 
     catch 
     { 
      throw 
     } 
    } 
} 
+0

Err, c'était une sorte d'idée. Je trouve toujours ça un peu circonstanciel. Mais si c'est le seul moyen, j'accepterai votre réponse. – Tom

+0

Je ne connais pas d'autre moyen de le faire. –