Требования к переменной PSModulePath перед запуском PowerShell

WPS = Windows PowerShell
PSC = ядро ​​PowerShell

Когда я начинал, у меня было три (3) пути как часть системной переменной среды PSModulePath.

%ProgramFiles%\WindowsPowerShell\Modules
%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules
C:\Program Files (x86)\Microsoft SQL Server\140\Tools\PowerShell\Modules\

Я предполагаю, что установка SQL Server создала последнюю. Но я удалил первые два, чтобы посмотреть, смогут ли PowerShell найти свой собственный путь или они им нужны?

WPS 5.1 64-bit appears to start ok, but ISE reports an error finding `ISE`.
PSC 6.2 starts ok. There is no ISE.
PSC 7.0 starts ok. There is no ISE.

Мне пришлось вернуть каталог %SystemRoot%\system32\WindowsPowerShell\v1.0\Modules в системную переменную среды PSModulePath. После этого WPS 5.1 и ISE запускаются корректно.

Нужен ли WPS 5 каталог System32 в PSModulePath перед запуском? Я хотел бы удалить его. И, вообще-то, я хотел бы переместить каталог SQL Server в более подходящее место. Есть ли место лучше? Я часто запускаю powershell -NoProfile из сценариев файлов .bat, поэтому я не думаю, что какой-либо из шести (6) сценариев профиля (12, если добавлено 32-битное) является хорошим местом. Что ты посоветуешь?

Обновлять

=== запустить cmd.exe

C:>echo %PSModulePath%
C:\Program Files (x86)\Microsoft SQL Server\140\Tools\PowerShell\Modules\;

=== запустить powershell.exe 5.1.18362.145

C:>$Env:PSModulePath
C:\Users\lit\Documents\WindowsPowerShell\Modules;C:\Program Files (x86)\Microsoft SQL Server\140\Tools\PowerShell\Modules\;C:\Program Files\WindowsPowerShell\Modules

=== беги

ipmo : The specified module 'ISE' was not loaded because no valid module file was found in any module directory.
At line:1 char:1
+ ipmo ISE
+ ~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (ISE:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

Расположение system32 содержит множество важных модулей (включая критические модули PowerShell), и PsModulePath — это то, как PowerShell их находит. Я могу понять модуль SQL, поскольку он находится в нестандартном месте, но зачем вам удалять другие места?

boxdog 16.06.2019 02:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 086
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В стороне, повторно:

PSC 6.2 [7.0] starts ok. There is no ISE.

ISE — это автономный исполняемый файл, который хозяева PowerShell, а не наоборот. Он может размещать только Windows PowerShell, но не PowerShell Основной, поэтому вы не можете использовать его для разработки кода PowerShell Основной.

Что касается вашего дополнительного вопроса: «Стоит ли мне ожидать, что когда-нибудь будет ISE для PSC, или я должен думать, что VS Code — это то, что нужно использовать?»

Действительно, Код Visual Studio с его Расширение PowerShell — это редактор, который будет использоваться в будущем.: он может быть ориентирован как на Windows PowerShell, так и на PowerShell Core, и все будущие усилия по разработке будут направлены на него.

Напротив, ISE только для Windows PowerShell не увидит новых функций. (Хотя .NET Core 3.0 гипотетически прокладывает путь для переноса ISE на основе WPF на .NET Core, я не думаю, что это произойдет.)


WPS 5.1 64-bit appears to start ok, but ISE reports an error finding ISE.

Исключение каталога $env:SYSTEMROOT\system32\WindowsPowerShell\v1.0\Modules из $env:PSModulePath не рекомендуется и приводит к следующим симптомам:

  • Команды из важных системных (поставляемых с Windows PowerShell) модулей, расположенных там, имеют все еще исполняемый, поскольку PowerShell, по-видимому, обращается к этому местоположению.

  • Однако обнаружение команд, завершение табуляции и вызовы явный к Import-Module модулем имя (в отличие от полного пути) перестают работать:

    • В данном случае речь идет о поведении ISE при запуске, который пытается явно загрузить модуль ISE (среди прочего) с помощью ipmo ISE (Import- Module), что не удается.
    • То, что неявно, загружающий модуль, все еще работает, можно проверить, просто напрямую вызвав одну из его команд, например, New-ISESnippet -?.

Когда дело доходит до определения эффективного значения $env:PSModulePath, выпуски PS принципиально различаются:

Windows PowerShell (WPS) использует сложные правила, чтобы определить, какие каталоги автоматически добавить в $env:PSModulePath; вкратце:

  • Модуль все пользователи dir., $env:ProgramFiles%\WindowsPowerShell\Modules автоматически добавляется всегда, если ваше значение $env:PSModulePath предопределено в реестр (по умолчанию оно предопределено является и установлено на $env:SYSTEMROOT\system32\WindowsPowerShell\v1.0\Modules).
  • Директория модуля текущий пользователь. добавляется только в том случае, если нет определения реестра уровень пользователя.

  • Вы можете переопределить все определения реестра со значением уровень процесса$env:PSModulePath установить специальный вызов доpowershell.exe.

Ядро PowerShell (WPC):

  • полностью игнорирует любые ранее существовавшие определения на основе реестра$env:PSModulePath и всегда определяет свой собственный список стандартных каталогов. при запуске, включая аналоги PSC для местоположений WPS плюс каталог системного модуля WPS, $env:SYSTEMROOT\system32\WindowsPowerShell\v1.0\Modules (поскольку все большее количество системных модулей WPS также можно использовать из PSC).

    • Впервые об этом неожиданном поведении было сообщено в эта проблема GitHub, ...
    • ... что привело к этот RFC, который все еще находится на рассмотрении на момент написания этой статьи, и окончательное решение еще не принято.
  • вводит значение уровень процесса$env:PSModulePath устанавливает специальный вызов доpowershell.exe в свой список стандартных каталогов после записи текущего пользователя - при условии, что значение отличается из любого определения на основе реестра.[1]

    • Если бы не неясное различие между значением на основе реестра и отличающимся значением ad hoc, поведение PSC, возможно, было бы более разумным: он допускает только добавление в список стандартных каталогов. через уже существующее $env:PSModulePath значение переменной окружения, а не через замена.

    • Игнорирование основанных на реестре определений имеет смысл, поскольку пользователи могли использовать его для указания каталогов, содержащих только модули WSM. Однако если бы для PSC был выбран другое имя переменной, этой проблемы можно было бы избежать — и это действительно решение, рассматриваемое в связанном RFC.


I would like to move the SQL Server directory to a more appropriate location. Is there a better place? I often run powershell -NoProfile from .bat file scripts

Без, изменяющий определение $env:PSModulePath на основе реестра:

  • Единственным каталогом, который будет работать для выпусков обе, будет $env:SYSTEMROOT\system32\WindowsPowerShell\v1.0\Modules, но, учитывая, что этот каталог предназначен для модулей, поставляемых с WPS, это не подходит.

  • Специально для издания, вы можете выбрать:

    • ВПС: $env:ProgramFiles\WindowsPowerShell\Modules
    • ПСК: $env:ProgramFiles\PowerShell\Modules

С участием модифицирует определение $env:PSModulePath на основе реестра:

  • Для WPS вы можете изменить определение реестра на уровне машины $env:PSModulePath в \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (которое вы также можете изменить с помощью sysdm.cpl, Advanced > Environment Variables...): Добавить выбранный вами каталог на существующее значение.

  • К сожалению, на момент написания этой статьи это не будет работать для PSC, поскольку, как указано, это определения на основе реестра игнорирует.


[1] It seems that the test for difference is sloppily implemented, in that setting an ad hoc value for which a registry-based value is a prefix match is considered identical; e.g., if value c:\modules is defined in the registry, an ad hoc value of c:\modules.core makes PowerShell Core think that the ad hoc value does not differ and ignores it.
Aside from that, this selective ignoring of environment-variable values depending on their method of definition is highly obscure.

Спасибо за Ваш, как всегда, подробный и полный ответ. Похоже, мне нужен каталог System32 в переменной PSModulePath перед запуском WPS, чтобы ISE работал. Я вижу, что PSC 6 и 7 пропускают то, что находится в PSModulePath, когда они начинаются. После запуска Install-Module -Name SqlServer я обнаружил, что к PSModulePath ничего не добавляется. Я предполагаю, что он не нужен, так как он находится в каталоге стандартных пользовательских модулей. Это правильно?

lit 17.06.2019 00:59

Я думаю, что игнорирование настроек реестра — это хорошо. На других платформах, на которых работает PSC, нет «реестра».

lit 17.06.2019 01:01

С удовольствием, @lit; да, Install-Module предназначен только для стандартных каталогов: стандартный каталог для всех пользователей. с -Scope AllUsers и стандартными каталогами текущего пользователя. с -Scope CurrentUser (по умолчанию в PSC).

mklement0 17.06.2019 03:07

Что касается игнорирования реестра: правда, на других платформах нет реестра, но у них есть переменные среды, и использование реестра является официальным методом в для определения переменных среды настойчиво в Windows. Обратите внимание, что PSC делает учитывает значения уровень процесса$env:PSModulePath, но только если они отличаться из определения на основе реестра, что является очень неясным различием (которое небрежно реализовано для загрузки — см. добавленную мной сноску).

mklement0 17.06.2019 03:37

@lit: Помимо этой проблемы, PSC демонстрирует разумное поведение в том смысле, что это добавляет каталоги. из уже существующей PSModulePath переменной окружения в список каталогов. вместо стандартных подавляющий.

mklement0 17.06.2019 03:38

В оболочке cmd, когда у меня есть путь к модулю SQL Server в PSModulePath, запуск PSC 6 или 7 создает Env: PSModulePath, который не содержит путь к модулю SQL Server.

lit 17.06.2019 16:30

@lit: если это значение исходит из реестр, PSC проигнорирует его. Попробуйте удалить его из реестра и установить в сеансе cmd перед вызовом PSC.

mklement0 17.06.2019 16:35

Я вижу, что удаление его из реестра, создание в оболочке cmd.exe, запуск PSC включит его в Env:PSModulePath. Я не уверен, как думать об этом как об улучшении. Если он есть в реестре, пропустите его. Если он есть в текущей среде, но отсутствует в реестре, включите его. Чем это лучше, чем просто использовать то, что находится в переменной PSModulePath, и никогда не читать реестр?

lit 17.06.2019 17:06

@lit, я просто рассказывал вам, что нужно, чтобы PSC увидел путь к модулю SQL Server, что, безусловно, неудобно и связано с текущим проблемным поведением PSC. Что касается решения для разных выпусков: за исключением добавления к $env:PSModulePath из файлов $PROFILE, специфичных для выпуска, которые вам (по понятным причинам) не нужны, я не знаю хорошего решения. Возможно, используйте ключ реестра [HKEY_CURRENT_USER\Software\Microsoft\Command Processor], значение AutoRun, чтобы установить env var. при запуске cmd.exe, но это своего рода профиль.

mklement0 17.06.2019 17:34

Другие вопросы по теме