Есть ли способ найти все модули, которые понадобятся в скрипте?

Я хотел бы использовать своего рода анализатор, который установит/импортирует все необходимые модули по сценарию, прежде чем запускать его на удаленной машине (на которой его не может быть) ......

Есть идеи ?

ИЗМЕНИТЬ

Вот случай: я на своей машине разработки, я уже установил множество модулей всех видов (dhcp, ntfs, удаленное взаимодействие, регистрация и т. д.). Когда я, наконец, заставил свой скрипт (который является функцией) работать, Я не могу быть уверен, какие модули используются....

Что я хочу, так это записать в разделе «Начало» правильный импорт, прежде чем отправлять свой сценарий на удаленные ПК; чтобы быть уверенным, что он будет работать идеально, понимаете?...

Есть ли какое-то стороннее приложение, которое может сканировать мой скрипт и предоставить мне все необходимые модули?


person Louis-Alex    schedule 22.02.2021    source источник
comment
Вы уже должны знать, какие модули нужны вашему скрипту и встраивать проверки   -  person Daniel    schedule 22.02.2021
comment
Что мне известно, так это то, что мой скрипт отлично работает на удаленном ПК ... спасибо за ваш конструктивный комментарий.   -  person Louis-Alex    schedule 22.02.2021
comment
Пожалуйста. Спасибо и вам за отличный вопрос!   -  person Daniel    schedule 22.02.2021
comment
Итак, я хочу сказать, что когда вы пишете скрипты/модули, вы должны заранее знать, какие еще модули нужны. Затем вы можете пометить свой скрипт/модуль флагами #Requires и т.п. docs.microsoft. com/en-us/powershell/module/   -  person Daniel    schedule 22.02.2021
comment
Я понимаю вашу точку зрения, но, как бы глупо это ни звучало для вас, если мой вопрос не был таким превосходным, он действительно указывал на МОИ потребности...   -  person Louis-Alex    schedule 23.02.2021


Ответы (2)


Вы можете сделать что-то подобное, чтобы получить помощь в поиске используемых команд и их имен источника/модуля. Это очень неотшлифовано, просто пытаюсь передать идею.

$scriptblock = {
    Write-Host "Nothing here"
    $files = Get-ChildItem c:\temp
    Get-ADUser someuser
    Test-NetConnection www.google.com
}

# Uncomment following lines and enter the path to your script file
# $scriptFile = "Path\to\some\scriptfile"
# $scriptblock = [scriptblock]::Create((Get-Content -raw -Path $scriptFile))

$ast = $scriptblock.Ast

$commands = $ast.FindAll( { $args[0] -is [System.Management.Automation.Language.CommandAst] }, $true)
$commandText = foreach ($command in $commands) {
    $command.CommandElements[0].Extent.Text
}

$commandText | 
    Select-Object -Unique | 
    Sort-Object |
    Select-Object @{
        Label      = "CommandName"
        Expression = { $_ } 
    },   
    @{
        Label      = "Source"
        Expression = { 
            (Get-Command $_).Source
        } 
    }

Выход

CommandName        Source
-----------        ------
Get-ADUser         ActiveDirectory
Get-ChildItem      Microsoft.PowerShell.Management
Test-NetConnection NetTCPIP
Write-Host         Microsoft.PowerShell.Utility
person Daniel    schedule 23.02.2021
comment
Я знаю, что его просят избегать подобных комментариев... но это работает!! На самом деле довольно хорошо !!!.. Ты потрясающий ! Спасибо !!! - person Louis-Alex; 23.02.2021

Да, вы можете, например, проверить, существует ли модуль на этой конкретной машине, попытавшись импортировать его следующим образом.

Try {
   Import-Module dbaclone -ErrorAction stop
   #ErrorAction required as failing to import is not a terminating action
} Catch {
   Write-Verbose -Verbose "Failed to find dbaclone module - installing"
   Install-Module dbaclone -AllowClobber -Force 
   Write-Verbose -Verbose "Installed!"
   Import-Module dbaclone
}
person Sebastian Wiszowaty    schedule 22.02.2021