Специальные символы кодируются при запуске скрипта внутри файла Powershell - PullRequest
0 голосов
/ 27 мая 2020

Привет, у меня есть сценарий для автоматизации некоторых задач, работающий в powershell core v.7. +.

В одном из этих сценариев, когда я запускаю команду внутри файла ps1 и возвращаемые специальные символы закодированы и я не могу декодировать в правильный формат, под командой, используемой для этого, и возвращением:

// the variable $script is my command its a ask-cli command to work in alexa
$model = pwsh -Command $script
/* 
* when I running the script from here the special characters returned is these:
* "nächste",
* "nächstgelegene"
*/

Но когда я запускаю ту же команду непосредственно в терминале, возвращаются строки:

/*
* "nächste",
* "nächstgelegene"
*/

Я хотел бы знать, как я могу запустить команду внутри файла без кодирования возврата. Я уже пробовал некоторые вещи, такие как:

   $encoding = [System.Text.Encoding]::Unicode

    $model = pwsh -Command $script

    Write-Output $model

    $model = $encoding.GetBytes($model)

    $model = $encoding.GetString($model)

Но не работают должным образом, я не знаю, как я могу это сделать, если кто-то может мне помочь с этим, я слишком ценю.

Ответы [ 4 ]

0 голосов
/ 28 мая 2020

После многих исследований я смог найти что-то более легкое для решения моей проблемы. Powershell по умолчанию имеет другой кодировщик вывода, используемый в этих случаях, и единственное, что мне нужно сделать, это изменить его.

Я использовал команду:

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

Я считаю, что этот вопрос объясняет как это работает, и это очень помогает, для получения дополнительных вопросов, пожалуйста, проверьте это ответ .

0 голосов
/ 27 мая 2020

Ниже моего скрипта:

(Get-Content "$currentPath\skill-package\skill.json" -Raw | ConvertFrom-Json).manifest.publishingInformation.locales.PSObject.Properties | ForEach-Object {
        $lang = $_.Name
        Write-Output "Profile: $profile skill-id: $skillId language: $lang"

        $script = "ask smapi get-interaction-model -l $lang -s $skillId -p $profile -g $env"

        Write-Output 'Running script'

        Write-Warning $script

        # $encoding = [System.Text.Encoding]::ASCII

        $model = pwsh -Command $script

        Write-Output $model

        $model = $model
        | ConvertFrom-Json -Depth 100 
        | Select-Object * -ExcludeProperty version 
        | ConvertTo-Json -Depth 100

        # out-file "$file$lang.json" -InputObject $model -Encoding ascii

        Write-Output "New model saved locally $file$lang.json"
    }
    Write-Warning 'Finished!!!'
0 голосов
/ 27 мая 2020
(Get-Content "$currentPath\skill-package\skill.json" -Raw | ConvertFrom-Json).manifest.publishingInformation.locales.PSObject.Properties | ForEach-Object {
    $lang = $_.Name
    Write-Output "Profile: $profile skill-id: $skillId language: $lang"

    $script = "`$command = ask smapi get-interaction-model -l $lang -s $skillId -p $profile -g $env;`$command = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes(Invoke-Expression `$command));`$command"

    Write-Output 'Running script'

    Write-Warning $script

    # $encoding = [System.Text.Encoding]::ASCII

    $model = pwsh -Command $script

    $model = Text.Encoding::Unicode.GetString([Convert]::FromBase64String($model))

    Write-Output $model

    $model = $model
    | ConvertFrom-Json -Depth 100 
    | Select-Object * -ExcludeProperty version 
    | ConvertTo-Json -Depth 100

    # out-file "$file$lang.json" -InputObject $model -Encoding ascii

    Write-Output "New model saved locally $file$lang.json"
}
Write-Warning 'Finished!!!'
0 голосов
/ 27 мая 2020

Попробуйте вернуть строку в байтах, а затем декодировать ее из того места, где вы вызываете функцию pw sh. Это убережет его от любых изменений. Что вы делаете, так это конвертируете его в байты после получения, а затем возвращаете в строку.

...