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





В стороне, повторно:
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 (среди прочего) с помощью ipmo ISE (Import- Module), что не удается.New-ISESnippet -?.Когда дело доходит до определения эффективного значения $env:PSModulePath, выпуски PS принципиально различаются:
Windows PowerShell (WPS) использует сложные правила, чтобы определить, какие каталоги автоматически добавить в $env:PSModulePath; вкратце:
$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).
вводит значение уровень процесса$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 -NoProfilefrom .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 ничего не добавляется. Я предполагаю, что он не нужен, так как он находится в каталоге стандартных пользовательских модулей. Это правильно?
Я думаю, что игнорирование настроек реестра — это хорошо. На других платформах, на которых работает PSC, нет «реестра».
С удовольствием, @lit; да, Install-Module предназначен только для стандартных каталогов: стандартный каталог для всех пользователей. с -Scope AllUsers и стандартными каталогами текущего пользователя. с -Scope CurrentUser (по умолчанию в PSC).
Что касается игнорирования реестра: правда, на других платформах нет реестра, но у них есть переменные среды, и использование реестра является официальным методом в для определения переменных среды настойчиво в Windows. Обратите внимание, что PSC делает учитывает значения уровень процесса$env:PSModulePath, но только если они отличаться из определения на основе реестра, что является очень неясным различием (которое небрежно реализовано для загрузки — см. добавленную мной сноску).
@lit: Помимо этой проблемы, PSC демонстрирует разумное поведение в том смысле, что это добавляет каталоги. из уже существующей PSModulePath переменной окружения в список каталогов. вместо стандартных подавляющий.
В оболочке cmd, когда у меня есть путь к модулю SQL Server в PSModulePath, запуск PSC 6 или 7 создает Env: PSModulePath, который не содержит путь к модулю SQL Server.
@lit: если это значение исходит из реестр, PSC проигнорирует его. Попробуйте удалить его из реестра и установить в сеансе cmd перед вызовом PSC.
Я вижу, что удаление его из реестра, создание в оболочке cmd.exe, запуск PSC включит его в Env:PSModulePath. Я не уверен, как думать об этом как об улучшении. Если он есть в реестре, пропустите его. Если он есть в текущей среде, но отсутствует в реестре, включите его. Чем это лучше, чем просто использовать то, что находится в переменной PSModulePath, и никогда не читать реестр?
@lit, я просто рассказывал вам, что нужно, чтобы PSC увидел путь к модулю SQL Server, что, безусловно, неудобно и связано с текущим проблемным поведением PSC. Что касается решения для разных выпусков: за исключением добавления к $env:PSModulePath из файлов $PROFILE, специфичных для выпуска, которые вам (по понятным причинам) не нужны, я не знаю хорошего решения. Возможно, используйте ключ реестра [HKEY_CURRENT_USER\Software\Microsoft\Command Processor], значение AutoRun, чтобы установить env var. при запуске cmd.exe, но это своего рода профиль.
Расположение
system32содержит множество важных модулей (включая критические модули PowerShell), иPsModulePath— это то, как PowerShell их находит. Я могу понять модуль SQL, поскольку он находится в нестандартном месте, но зачем вам удалять другие места?