#powershell
#powershell
Вопрос:
Для использования класса в сценарии powershell (V7) представляется необходимым объявить модуль, в котором реализован класс (язык Powershell), через
using module .MyModule.psm1
Модуль «MyModule.psm1» импортирует модуль powershell через
Import-Module powershell-yaml -DisableNameChecking
Как я могу подавить предупреждения о «неутвержденных глаголах» во время выполнения скрипта? Опция DisableNameChecking, похоже, здесь не помогает
Полный пример модуля
Import-Module powershell-yaml -DisableNameChecking
class TestManager {
hidden [string] $NodeTypeApplication = "Application"
TestManager () {
}
[void] StartDeployment()
{
Write-Host("starting deployment...")
}
}
Комментарии:
1. Я не могу воспроизвести это, пожалуйста, предоставьте содержимое образца
psm1
файла, который демонстрирует эту проблему2. да, на самом деле это не мой класс, кажется, что импорт модуля внутри модуля, содержащего класс, запускает сообщение. Обновил свой вопрос.
3. это сообщение, созданное самим PoSh или PSReadline? если 2-й, то вы можете определить пользовательское правило, чтобы НЕ показывать это сообщение.
4. он производится оболочкой
Ответ №1:
Хотя вы используете -DisableNameChecking
для импорта вложенный модуль ( powershell-yaml
), предупреждение может появиться для заключающего модуля, если нестандартные функции из вложенного модуля становятся частью экспорта заключающего модуля.
У вас есть два варианта:
-
Если вам действительно нужно экспортировать (вложенные) нестандартные функции из вашего прилагаемого модуля:
-
Единственный способ отключить предупреждение и для заключающего модуля — это импортировать его с помощью
Import-Module -DisableNameChecking
также, а не черезusing module
. -
Предостережение: К сожалению, это исключает использование пользовательских классов PowerShell, определенных в вашем модуле
using module
; начиная с версии 7.0, пользовательские классы становятся видимыми импортеру только в том случае, если вы используете (см. Справочную информацию на GitHub issue # 2449″). -
Чтобы решить эту проблему:
- Определите функции-оболочки для тех нестандартных функций, которые вам нужно экспортировать, и дайте им имена, соответствующие стандартам.
- Затем исключите нестандартные функции из экспорта вашего модуля — смотрите следующий пункт.
-
-
В противном случае исключите нестандартные функции из экспорта, что вы можете сделать одним из следующих способов:
-
Если они вам на самом деле не нужны внутри самого вашего модуля, исключите их из импорта, передав в
Import-Module
параметр-Function
только имена функций, которые вам действительно нужны. -
В противном случае вы можете явно управлять тем, что экспортирует ваш вложенный модуль:
- Вы можете использовать
Export-ModuleMember
вызов во вложенном модуле. - В качестве альтернативы / дополнительно, вы можете ограничить экспортируемые функции, если вы заставите свой заключающий модуль использовать манифест модуля (
*.psd1
файл).
- Вы можете использовать
-
Вот простая демонстрация исходной проблемы:
# Create a temp. nested module with a nonstandard function.
'function UnapprovedVerb-Foo { ''unapproved foo'' }' > tmp_nested.psm1
# Create the enclosing module that imports the nested module
# with warnings suppressed.
# However, because the enclosing module has no manifest, the nested
# functions are exported alongside its own functions.
'Import-Module $PSScriptRoot/tmp_nested.psm1 -DisableNameChecking; function Get-Foo { ''foo'' }' > tmp_enclosing.psm1
# This now triggers the warning - as import via `using module` would.
# Adding -DisableNameChecking would silence it, but `using module` has
# no equivalent mechanism - and you need the latter to import *custom PS classes*.
Import-Module ./tmp_enclosing.psm1