Примечание. Этот ответ применяется с PowerShell Core 7.0.0-preview.4;надеюсь, текущее поведение станет более предсказуемым, как это предлагается в этом выпуске GitHub .
tl; dr
Удалить файлC:\Windows\System32\Get-Service
из вашей системы - его там не должно быть.
После этого Get-Service
снова начнет работать.
PowerShell пытается открыть, возможно, случайноСоздан файл C:\Windows\System32\Get-Service
без расширения в вашей системе первый , , если вы еще не импортировали модуль Microsoft.PowerShell.Management
в сеансе .
Модуль Microsoft.PowerShell.Management
, который содержит командлеты Get-Service
и Set-Service
(среди прочих команд), обычно импортируется по требованию при первой попытке выполнить одну из его команд в сеансе.
Технически, поскольку модуль расположен в известном месте, он подлежит автоматической загрузке модуля .
Однако еслимодуль еще не импортирован, внешний файл программы / документа с тем же именем находится в одном из перечисленных каталогов. n Переменная окружения $env:PATH
имеет приоритет , а it выполняется / открывается по умолчанию.
Поскольку файл в вашем случае не имел расширения имени файлаоболочка Windows не знала, как ее открыть, что привело к появившемуся сообщению об ошибке (если дважды щелкнуть файл в проводнике, вместо этого появится диалоговое окно «Как открыть этот файл?»).
В результате, попытка выполнить команду с именем Get-Service
сама по себе не инициирует импорт модуля Microsoft.PowerShell.Management
- внешний файл продолжает вызываться.
В отличие от этого, поскольку командлет Set-Service
не скрыт внешним файлом, вызов it неявно импортирует модуль.
После того, как модульбыла импортирована, отправка команды Get-Service
вызывает командлет , а не внешний файл , потому что приоритет обычной команды PowerShell затем запускается, где командлеты имеют приоритет над внешними программами сгоe то же имя.
Это ситуативное различие затрудняет прогноз поведения при исполнении . Вместо этого PowerShell должен последовательно отдавать приоритет известным командлетам, независимо от того, был ли их модуль импортирован в текущий сеанс или нет : см. эту проблему GitHub .
Чтобы однозначно вызвать команду из данного модуля, добавьте префикс имени команды с именем модуля, за которым следует \
:
То естьдаже без импорта модуля вы могли бы вызвать командлет Get-Service
следующим образом:
Microsoft.PowerShell.Management\Get-Service