2016-12-29 4 views
1

Я собрал сценарий Powershell, который предназначен для захвата других скриптов, размещенных на блоках Azure, и их выполнения.Вызов сценария powershell из другого сценария powershell и гарантирование его UTF8

Соответствующие блоки кода:

Получение сценария:

$resp = (Invoke-WebRequest -Uri $scriptUri -Method GET -ContentType "application/octet-stream;charset=utf-8") 
$migrationScript = [system.Text.Encoding]::UTF8.GetString($resp.RawContentStream.ToArray()); 
$tempPath = Get-ScriptDirectory 
$fileLocation = CreateTempFile $tempPath "migrationScript.ps1" $migrationScript 

Создание файла:

$newFile = "$tempFolder"+"\"+"$fileName" 
Write-Host "Creating temporary file $newFile" 
[System.IO.File]::WriteAllText($newFile, $fileContents) 

А потом я вызываю загруженный файл с

Invoke-Expression "& `"$fileLocation`" $migrationArgs" 

Это хорошо работает, для чего мне нужно. Однако Invoke-Expression неправильно считывает кодировку файла. Он корректно открывается в «Блокноте» или «Блокнот ++», но не в ISE (где я выполняю скрипт прямо сейчас).

Есть ли способ, которым я могу убедиться, что скрипт читается правильно? Необходимо поддерживать UTF8, так как есть вероятность, что сценарии должны будут выполнять такие операции, как установка AppSetting на значение, содержащее специальные символы.

РЕДАКТИРОВАТЬ: Поведение такое же на «ванильном» вызове не-ISE Powershell.

+2

У сценариев есть спецификация Юникода для UTF-8 в начале файла? – lit

+1

1) 'Invoke-Expression' имеет отношение к чтению файла, он только вызывает строку как код PowerShell. 2) Файл должен содержать спецификацию, чтобы UTF-8 был распознан PowerShell. 3) Строка может быть вызвана как код PowerShell, не сохраняя ее во временном файле. – PetSerAl

+0

Нет, они отображаются без спецификации даже с Показать все символы в блокноте ++ –

ответ

0

В соответствии с @lit и @PetSerAI спецификация - это, необходимый для работы Powershell.

Моя первая попытка не увенчалась успехом, так что я перешел обратно к не-бом, но со следующими шагами, он работал:

  1. Выполните Invoke-WebRequest с -ContentType "application/octet-stream;charset=utf-8"

  2. Возьмите содержимое Raw (вы увидите его в Powershell как ряд чисел, которые, я полагаю, являются ascii-кодами?) И конвертируют его байты с [system.Text.Encoding]::UTF8.GetString($resp.RawContentStream.ToArray()); в массив, содержащий нужные вам символы.

  3. При сохранении файла через WriteAllText .NET убедитесь, что вы используете UTF8, [System.IO.File]::WriteAllText($newFile, $fileContents, [System.Text.Encoding]::UTF8). В этом случае UTF8 понимается как UTF8 с байтовой надписью, и это то, что требуется Powershell.

+1

для шага 3 вы должны использовать 'Set-Content -Encoding UTF8', это будет работать более универсально в PowerShell – TravisEz13

 Смежные вопросы

  • Нет связанных вопросов^_^