Проблема кодировки символов со строковым литералом в исходном коде - PullRequest
0 голосов
/ 20 февраля 2019
$logstring = Invoke-Command -ComputerName $filesServer   -ScriptBlock {
        param(
            $logstring,
            $grp
        )

    $Klassenbuchordner = "KB " + $grp.Gruppe
    $Gruppenordner = $grp.Gruppe
    $share = $grp.Gruppe
    $path = "D:\Gruppen\$Gruppenordner"

    if ((Test-Path D:\Dozenten\01_Klassenbücher\$Klassenbuchordner) -eq $true)
    {$logstring += "Verzeichnis für Klassenbücher existiert bereits"}
    else {
        mkdir D:\Dozenten\01_Klassenbücher\$Klassenbuchordner
        $logstring += "Klassenbuchordner wurde erstellt!"
    }} -ArgumentList $logstring, $grp

Моя цель - проверить существование каталога и создать его по требованию.

Проблема в том, что путь содержит немецкие буквы (умляуты), которые цель не видит правильносервер.

Например, сервер получает путь "D:\Dozent\01_Klassenbücher" вместо ожидаемого "D:\Dozent\01_Klassenbücher".

Как я могу форсировать правильную кодировку UTF-8?

1 Ответ

0 голосов
/ 20 февраля 2019

Примечание: Удаление и использование Invoke-Command являются случайными для вашей проблемы .

Так как проблема возникает с строковым литералом в исходном коде (...\01_Klassenbücher\...) наиболее вероятное объяснение состоит в том, что файл сценария неправильно интерпретирован PowerShell .

в Windows PowerShell (в отличие от PowerShel *).1017 * Core ), если ваш файл сценария де-факто имеет кодировку UTF-8, но не имеет спецификации , PowerShell неверно интерпретирует любые символы, не входящие в ASCII-диапазон (например,ü) в скрипте. [1]

Поэтому: Повторно сохраните ваш скрипт как UTF-8 с BOM .


Почему вы должны сохранять свои сценарии как UTF-8 с спецификацией:

Код Visual Studio и другие современные редакторы создают файлы UTF-8 без спецификации по умолчанию, что является причиной проблемы в Windows PowerShell.

В отличие от этого, PowerShell ISE создает файлы [1] с кодировкой ANSI, которые Windows PowerShell, но не PowerShell Core , читает правильно.

Вы можете обойтись только с файлами, закодированными в ANSI:

  • , если ваши скрипты никогда не будут выполняться в PowerShell Core - где все будущие усилия по разработкебудет идти.

  • , если ваши сценарии никогда не будут выполняться на компьютере, на котором действует другая кодовая страница "ANSI".

  • , если ваш скрипт не содержит символов - например, эмодзи - которые не могут быть представлены вашей кодовой страницей "ANSI".

Учитывая эти ограничения, это самый безопасный- и на будущее - всегда создавать сценарии PowerShell как UTF-8 с спецификацией .
(В качестве альтернативы вы можете использовать UTF-16 (который всегда сохраняется с * 1075)* BOM), но это увеличивает размер файла, если вы в основном используете символы ASCII / ANSI, что, скорее всего, в сценарии PSs).


Как заставить Visual Studio Code создавать файлы UTF-8 с BOM для сценариев PowerShell по умолчанию :

Примечание. Для версии v1.11.0 расширение PowerShell для VSCode все еще требуется следующее, но не существует предложения сделать расширение default PowerShell для файлов UTF-8 с спецификацией на GitHub .

Добавьте следующее в файл settings.json (из палитры команд ( Ctrl + Shift + P), введите settings и выберите Preferences: Open Settings (JSON)):

"[powershell]": {
  "files.encoding": "utf8bom"
}

Обратите внимание, что параметр преднамеренно ограничен PowerShell только для файлов , потому что выне хотел бы, чтобы для всех файлов по умолчанию использовалось UTF-8 с спецификацией , учитывая, что многие утилиты на платформах Unix не ожидают и не знают, как обрабатывать такую ​​спецификацию.


[1] В отсутствие спецификации Windows PowerShell по умолчанию определяет кодировку текущей кодовой страницы "ANSI" системы, как определенопод редакцией устаревшей локали системы;например, в западноевропейских культурах Windows-1252.

...