Я собрал сценарий 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.
У сценариев есть спецификация Юникода для UTF-8 в начале файла? – lit
1) 'Invoke-Expression' имеет отношение к чтению файла, он только вызывает строку как код PowerShell. 2) Файл должен содержать спецификацию, чтобы UTF-8 был распознан PowerShell. 3) Строка может быть вызвана как код PowerShell, не сохраняя ее во временном файле. – PetSerAl
Нет, они отображаются без спецификации даже с Показать все символы в блокноте ++ –