Ошибки PowerShell: работа с «термин не распознан как имя командлета»

Опубликовано: 16 Марта, 2023
Ошибки PowerShell: работа с «термин не распознан как имя командлета»

Как человек, написавший множество статей о Microsoft PowerShell для TechGenix, я часто слышу, как люди говорят мне, что они находят PowerShell пугающим, потому что, когда что-то идет не так, сообщения об ошибках могут быть загадочными и бесполезными. Таким образом, я хотел воспользоваться возможностью, чтобы поговорить о некоторых основных причинах, пожалуй, самой распространенной из всех ошибок PowerShell.

«Срок не распознан»

Самая простая и вместе с тем одна из самых распространенных ошибок PowerShell заключается в том, что термин не распознается как имя командлета, функции, файла сценария или исполняемой программы. Далее в ошибке говорится, что вы должны проверить написание имени или если путь был включен, чтобы убедиться, что путь правильный, и повторить попытку. Пример этой ошибки вы можете увидеть на рисунке ниже.

Орфографические ошибки

Есть три основные причины этой ошибки (и несколько других причин, связанных с тремя основными причинами). Как вы, возможно, уже поняли, наиболее распространенной причиной является просто неправильное написание имени командлета. (Очевидно, что это одна из основных причин всех ошибок PowerShell.) Например, на снимке экрана я намеренно неправильно написал командлет Get-Help. Таким образом, если вы получаете эту конкретную ошибку, вам всегда следует начинать процесс устранения неполадок с проверки правописания.

Ошибки пути

Вторая причина появления этого сообщения об ошибке заключается в том, что вы используете неправильный путь. Например, на моем компьютере есть папка с именем C:Scripts, и эта папка содержит ряд различных сценариев PowerShell, в том числе сценарий Calendar.ps1, отображающий графический календарь, созданный с помощью PowerShell. Если бы я перешел в папку C:Scripts и запустил сценарий календаря, сценарий заработал бы так, как ожидалось. Однако, если я попытаюсь выполнить скрипт из корневой папки (без указания пути), я получу сообщение об ошибке, как показано ниже.

Имейте в виду, что то же самое может произойти, если вы попытаетесь вызвать внешнюю функцию без указания пути. Говоря о функциях, есть ситуации, в которых вызов функции может вызвать эту ошибку, даже если функция существует в том же скрипте. Это происходит, когда вы ошибаетесь в имени функции или пытаетесь вызвать функцию, которая существует в другой области. Простой (хотя иногда не одобряемый) способ решить эту проблему — сделать функцию глобальной, добавив слово global к имени функции. Предположим, например, что в настоящее время у вас есть функция с именем Test, которая выглядит следующим образом:

Функциональный тест ($ X)
{
//
}

Вот как это будет выглядеть, если вы сделаете функцию глобальной:

Функция глобальная: Тест($x)
{
//
}

Отсутствующие модули

Третья причина этой ошибки — невозможность загрузить требуемый модуль. В PowerShell модули — это наборы командлетов, которые расширяют функциональные возможности PowerShell. В большинстве случаев командлеты, содержащиеся в модуле, относятся к конкретному продукту или к определенной роли или функции Windows. Например, модуль может содержать командлеты, относящиеся к Microsoft Azure, Hyper-V, Active Directory или даже к Exchange Server.

В любом случае вы не сможете запустить несобственный командлет PowerShell, если сначала не будет загружен модуль, определяющий этот командлет. Сама Windows включает в себя множество модулей, предоставляющих командлеты PowerShell для нестандартных функций Windows, таких как Hyper-V или Active Directory. Более новые версии PowerShell будут загружать эти модули автоматически по мере необходимости, тогда как более старые версии PowerShell требуют, чтобы вы явно загружали необходимые модули. Модули, содержащие неродные командлеты, почти всегда приходится загружать вручную.

Чтобы увидеть, как выглядят модули и как они работают, посмотрите скриншот ниже. Первое, что я делаю, — использую командлет Get-Module для отображения списка загруженных в данный момент модулей. В данном случае загружено три модуля. Командлет Get-Module показывает имена каждого модуля и командлеты, которые он содержит.

Следующее, что я сделал, это запустил командлет Get-VM. Это специальный командлет Hyper-V, который не включен в набор командлетов Windows по умолчанию. Обратите внимание, что командлет выполнен успешно. Это произошло из-за того, что я работаю в более новой версии Windows, а также потому, что командлет Get-VM является родным для Windows, даже несмотря на то, что соответствующий модуль не загружается по умолчанию. Если вам интересно, командлет Get-VM отображает имена виртуальных машин Hyper-V, существующих на сервере. Конечно, функция командлета не имеет отношения к этому обсуждению, так как я хотел сосредоточиться в первую очередь на устранении ошибок.

Моим последним шагом было еще раз запустить командлет Get-Module. На этот раз модуль Hyper-V включен в список модулей, загружаемых в Windows. Поскольку модуль был импортирован, я могу запускать любые специальные командлеты Hyper-V, включенные в модуль. Конечно, Windows загрузила этот модуль для меня автоматически, но тот же базовый принцип применим и к сторонним модулям, которые вы должны загружать вручную.

Если вам когда-либо понадобится вручную импортировать модуль для запуска командлета PowerShell, вы можете сделать это с помощью командлета Import-Module, за которым следует имя модуля, содержащего командлет, который вы хотите запустить. Имейте в виду, что модуль остается на месте только на время сеанса PowerShell. Если вы хотите снова использовать командлет в другое время, вам нужно будет снова импортировать модуль.

Ошибки PowerShell: много причин

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