Powershell не выводит "£" в теле письма html - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующий код, который подсчитывает количество PDF-файлов в определенных c папках, подсчитывает количество листов в этих c PDF-файлах и отправляет электронное письмо с этими данными.

Я анонимизировал часть скрипта.

Set-ExecutionPolicy Unrestricted

#This gets the number of PDF files in the Archive folder, this shows the successful uploads to Portal.
$Archive = $($compareDate = (Get-Date).AddDays(-7)    
@(Get-ChildItem -Path "C:\Archive\*.*" -Filter *.pdf -Recurse | Where-Object { $_.LastWriteTime -gt $compareDate}).Count)

#This gets the number of PDF files in the Exception folder, this shows the failed uploads to Portal.
$Exception = $($compareDate = (Get-Date).AddDays(-7)    
@(Get-ChildItem -Path "C:\Exception\*.*" -Filter *.pdf -Recurse | Where-Object { $_.LastWriteTime -gt $compareDate}).Count)

#This gets the number of pages in all PDF files succsssfully upoaded to Portal.
$folder = $($compareDate = (Get-Date).AddDays(-7)    
@(Get-ChildItem -Path "C:\Archive\*.*" -Filter *.pdf -Recurse | Where-Object { $_.LastWriteTime -gt $compareDate}))

$Count = $Files = 0

foreach($File in (Get-ChildItem -Path $Folder -Filter *.pdf)){
    $Pages = (C:\PS_Scripts\xpdf-tools-win-4.02\xpdf-tools-win-4.02\bin64\pdfinfo.exe $File.FullName | Select-String -Pattern '(?<=Pages:\s*)\d+').Matches.Value
    $Count += $Pages
    $Files++}
$Count

#This calculates the saving on sheets of paper, not including ink and printers. Each ream of 500 sheets costs us £1.98. So a single sheet costs 0.4 pence
$Saving = (($Count*0.4)/100)

#This converts the number to £nn.nn
$Pounds = '{0:C}' -f $Saving
$Pounds

#This gets Mondays Date
$Friday=  (Get-Date).AddDays(-7).ToString('dd/MM/yyyy')  

#This gets Sundays Date
$Thursday= (Get-Date).AddDays(-1).ToString('dd/MM/yyyy')  

#This begins the email  
$recipients = "user1 <user1@email.com>"

send-mailmessage -from "emailtest@email.com" `
            -to $recipients `
            -Subject "Weekly Data" `
            -body "Hi all,
            <br />
            <br />
            Please find below the weekly stats for Reports going to Portal. 
            <br />
            <br />
            From Friday to Thursday ($Friday- $Thursday), there were $Archive successful automated reports sent to Portal.
            <br />
            <br />
            This saved us printing, and scanning $Count pages of paper.
            <br />
            <br />
            This amounts to roughly $Pounds in savings during this period on paper alone!
            <br />
            <br />
            Also, during this same period, there were $Exception failed reports sent to Portal, these have either been rectified or will be rectified imminently.
            <br />
            <br />
            <br />"`
            -BodyAsHtml `
            -priority  Normal `
            -dno onSuccess, onFailure `
            -smtpServer  egat@email.com

Set-ExecutionPolicy Restricted

Моя проблема связана именно с $ Pounds, он делает все, что я хочу. Он выводит вычисление в следующем формате, £ nn.nn, например: 45,52 фунтов стерлингов. Я подтвердил это, поскольку в Powershell ISE я возвращаю значение $ Pounds, чтобы проверить его работу.

Но когда я получаю электронной почты, знак £ заменен на "?", см. копию сообщения электронной почты ниже,

Всем привет,

Ниже представлена ​​еженедельная статистика отчетов, отправляемых на портал.

С понедельника по воскресенье (01.05.2020 - 07.05.2020) на прошлой неделе на портал было отправлено 235 успешных автоматических отчетов.

Это спасло нас от печати и сканирования 1256 страниц на бумаге.

Это составляет примерно 5,02 евро экономии за этот период только на бумаге!

Кроме того, в течение этого же периода на портал было отправлено 0 неудачных отчетов, они либо были исправлены или будет исправлено в ближайшее время.

Почему не отображается 5,02 фунтов стерлингов?

Любая помощь будет принята с благодарностью.

Спасибо, Ухудж

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы можете 'Html Entify' знак фунта, используя HttpUtility класс в System.Web:

Add-Type -AssemblyName System.Web
$Pound = [System.Web.HttpUtility]::HtmlEncode('£123.456')

выводит

&#163;123.456

который в HTML показывает

£123.456
1 голос
/ 08 мая 2020

Это проблема кодировки HTML. Я думаю, вам нужно использовать следующий код.

# Instead of converting to Pounds, round down to two decimal places
$pounds = [math]::Round($Saving,2)

# html
"This amounts to roughly &pound;$Pounds in savings during this period on paper alone!"

Или, возможно, не имея возможности проверить, добавьте -Encoding [System.Text.Encoding]::UTF8 к Send-MailMessage

EDIT

Разница между кодировкой по умолчанию и кодировкой UTF8. Ваша почтовая программа, вероятно, находится в кодировке UTF8, и 163 сам по себе не является отображаемым символом.

$Pound = "£"
$enc = [System.Text.Encoding]::UTF8
$enc.GetBytes($Pound)
194
163
$def = [System.Text.Encoding]::Default
$def.GetBytes($Pound)
163

Go с первым вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...