@devil1313

Powershell, что не так с кодировкой в переменной?

Добрый день!

Необходимо: на Windows автоматизиировать отправку файлов по почте из определенной папки отдельными письмами, так чтобы одно письмо- один файл.
Из нюансов: Путь к папке содержит русские буквы и квадратные скобки.

Был написан простой скрипт на PS:
$filename = "sendmail.log"
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #Директория где запущен скрипт, без последнего "\"
$path = $scriptPath + "\" + $filename

function logging ($LogMessage){
	"$(Get-Date -UFormat "%d-%m-%Y %T") $LogMessage"|out-file $path -Append
}

function SendMailToUser($To,$ErrorTo) {
    $From="email@test.ru"
    $Subject="Invoice"
    $Body="Invoice"
    $Password="12345"
    $SecPassword=New-Object -TypeName System.Security.SecureString
    $Password.ToCharArray() | foreach {$SecPassword.AppendChar($_)}
    $Credintial=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $From,$SecPassword
	$smtpServer="test.ru"
	$encoding = [System.Text.Encoding]::UTF8
	$InvoicesPath = 'B:\TEMP\рус[1]\*'
    $invoices = Get-ChildItem $InvoicesPath | % { $_.FullName }
    foreach ($invoice in $invoices)
		{try{
			Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -Credential $Credintial -SmtpServer $smtpServer -Attachments $invoice -Encoding $encoding -ErrorAction Stop
			logging -LogMessage "$Invoice sent successfully"
			Remove-Item $invoice
			logging -LogMessage "$Invoice cleared successfully"
			}
		catch{
			$ErrorSubject="Error sending: $invoice"
			$ErrorBody="$(Get-date)111 Error:$($Error[0])"
			Send-MailMessage -From $From -To $ErrorTo -Subject $ErrorSubject -Body $ErrorBody -Credential $Credintial -SmtpServer $smtpServer -Encoding $encoding
			logging -LogMessage "$Invoice was not send! Error:$($Error[0])"
			}
		}
}

SendMailToUser -To "1@test.ru" -ErrorTo "2@test.ru"


При выполнении выдает ошибку:
Get-ChildItem : Не удается найти путь "B:\TEMP\С?С?С?", так как он не существует.
C:\bin\sendmail.ps1:28 знак:17
+     $invoices = Get-ChildItem $InvoicesPath | % { $_.FullName }
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (B:\TEMP\С?С?С?:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


Пробовал использовать get-childitem параметр -LiteralPath, не помогло, разные символы экранирования и тд. Прошу вашей помощи, уже не знаю куда дальше копать. С путем латинскими буквами работает.
  • Вопрос задан
  • 1439 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
С боььшой вероятностью у вас файл скрипта в колировке utf-8 или utf-16 без BOM. Попробуйте его пересохранить в кодировке utf-8 с BOM или в 1251
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@azarij
В меру опытный никто
попробуйте вместо:
$InvoicesPath = 'B:\TEMP\рус[1]\*'
поставить:
$InvoicesPath = '\\?\B:\TEMP\рус[1]\*'

а если не поможет, то добавьте -LiteralPath вот так:
$invoices = Get-ChildItem -LiteralPath $InvoicesPath | % { $_.FullName }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы