Что означает ### PSLOC в файлах локализации PSD1

В каждом почти каждом проекте Microsoft, использующем файлы локализации, есть текст ###PSLOC до и после блока строк ресурсов. Вот пример:

ConvertFrom-StringData @'
###PSLOC
MyString=This is a string.
###PSLOC
'@

Вот пример из PowerShellGet репо.

Я не могу найти ссылку на это в любом из файлов справки. Я просмотрел about_Data_Sections, ConvertFrom-StringData и about_Script_Internationalization. И единственные экземпляры ###PSLOC в источник PowerShell находится в файлах ресурсов, как показано выше.

В частности, я хотел бы знать:

  • Что это означает наличие или отсутствие сервера PowerShell.
  • Предпочтительно также, где в источнике PowerShell обрабатывается

Ответ 1

###PSLOC используется внутренним инструментом локализации при создании Windows. Комментарий никак не связан с движком PowerShell.

Инструмент локализации расширяется для поддержки множества разных парсеров файлов для извлечения ресурсов для дальнейшей обработки локализации.

Расширение для PowerShell основано на ini файловом синтаксическом анализаторе, а комментарии используются для анализа анализатора при игнорировании строк. Это позволяет авторам файла psd1 смешивать надлежащую PowerShell и строки, в которых синтаксический анализатор ini не будет иметь проблем с.

Ответ 2

Я искал какое-то время и пришел к выводу, что ###PSLOC является просто конвенцией и не имеет особого значения, хотя я не мог найти официальный документ.

Я нашел некоторые документы Microsoft, которые привели меня к такому выводу. Например: "Руководство по моделированию анализатора базовой линии Microsoft" показывает этот пример на стр. 20:

Пример файла содержимого
Ниже приведен пример файла содержимого модели Antivirus: Antivirus.psd1

   # Only add new (name,value) pairs to the end of this table
   # Do not remove, insert or re-arrange entries
   ConvertFrom-StringData @'
   ###PSLOC start localizing
    #
    # helpID="ScanBootSector"
    #
    ScanBootSector_title = Boot Sector Scan (Indicator Setting {0})
    ScanBootSector_problem = tbd: Problem for Constant name issue-1
    ScanBootSector_impact = tbd: Impact for Constant name issue-1
    ScanBootSector_resolution = tbd: Resolution for Constant name issue-1
    ScanBootSector_compliant =  tbd: Compliant for Constant name issue-1
    #
    # helpID="AutoUpdateStatus"
    #
    AutoUpdateStatus_title = Auto Update Status (Indicator Setting {0})
    AutoUpdateStatus_problem = tbd: Problem for Constant name issue-2
    AutoUpdateStatus_impact = tbd: Impact for Constant name issue-2
    AutoUpdateStatus_resolution = tbd: Resolution for Constant name issue-2
    AutoUpdateStatus_compliant =  tbd: Compliant for Constant name issue-2
  '@

Обратите внимание, что ###PSLOC, за которым следует дополнительное описание и более простые комментарии, и закрытие ###PSLOC отсутствует.

Книга "Pro PowerShell для разработчиков баз данных" Брайана П. Кафферки показана на с. 140 разделы ConvertFrom-StringData, которые не включают в себя ###PSLOC блоки/теги вообще.

Другая подсказка исходит из моей собственной системы Windows 10.
Я grepped все *.psd1 файлы и узнал, что у некоторых нет надлежащего закрытия ###PSLOC -block/tag, но ###PSCLOCC insead, например. c:\windows\WinSxS\amd64_microsoft-windows-pnpdevice-powershell_31bf3856ad364e35_10.0.15063.0_none_e99b05a055a1e6c4\PnpDevice.Resource.psd1 (это также может быть ошибкой).

Наконец, я искал репозиторий Powershell (core), но не смог найти никакого лечения для ###PSLOC.

Итак, случай не на 100% ясен. Но, возможно, я нашел несколько убедительных доказательств того, что это не имеет особого значения.