2011-11-16 47 views
4

我想使用cmdlet send-mailmessage发送包含powershell函数的电子邮件。 我需要修改文本的编码。 cmdlet send-mailmessage具有参数“encoding”,它使用类System.Text.Encoding。 所以我不得不使用这样的事情:PowerShell邮件编码

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

我想使用-Encoding UTF8代替。 Out-File cmdlet可以像这样工作。如何从Out-File cmdlet中重现该行为?

这是我的想法,但我觉得有点旁证:

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

有了这个,我会创建相应的编码。

[System.Text.Encoding]::$Encoding 

回答

2

您可以创建代理函数,将Encoding参数的类型更改为System.String并在Begin块中对其进行操作。我将这个例子包含在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

错误,这是我的想法。我仍然觉得它有点环境。但如果这是我接受你的答案的唯一方法。 – Tom

+0

我不知道有任何其他的方式来做到这一点。 –