Есть ли способ показать все функции в скрипте PowerShell? - PullRequest
1 голос
/ 30 января 2020

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

Как я создал функцию doXY и функцию getAB C или что-то в этом роде.

Затем я набираю команду, и она показывает:

  1. Функция doXY
  2. Функция getAB C

Было бы крутой функцией ^ ^

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 31 января 2020

Где ваш скрипт называется things.ps1, что-то вроде ...

cat ./things.ps1 | grep function

Для MacOS / Linux или ...

cat ./things.ps1 | select-string function

Для Windows.

0 голосов
/ 31 января 2020

Вы можете заставить PowerShell анализировать ваш сценарий, а затем найти определения функций в результирующем абстрактном синтаксическом дереве (AST).

Get-Command, вероятно, самый простой способ доступа к AST:

# Use Get-Command to parse the script
$myScript = Get-Command .\path\to\script.ps1
$scriptAST = $myScript.ScriptBlock.AST

# Search the AST for function definitions
$functionDefinitions = $scriptAST.FindAll({
  $args[0] -is [Management.Automation.Language.FunctionDefinitionAst]
}, $false)

# Report function name and line number in the script
$functionDefinitions |ForEach-Object {
    Write-Host "Function '$($_.Name)' found on line $($_.StartLineNumber)!"
}

Вы также можете использовать это для анализа содержимого функций и параметров при необходимости.

0 голосов
/ 30 января 2020

Это встроенная функция, как показано в файлах справки PowerShell.

About_Providers

Подобные вопросы уже задавались ранее. Итак, это потенциальная копия:

Как получить список пользовательских функций Powershell?

Ответы ... Использование функции PSDrive

# To get a list of available functions
Get-ChildItem function:\

# To remove a powershell function
# removes `someFunction`
Remove-Item function:\someFunction

Или

Function Get-MyCommands {
    Get-Content -Path $profile | Select-String -Pattern "^function.+" | ForEach-Object {
        [Regex]::Matches($_, "^function ([a-z.-]+)","IgnoreCase").Groups[1].Value
    } | Where-Object { $_ -ine "prompt" } | Sort-Object
}

Или этот

Получить список функций из скрипта

$currentFunctions = Get-ChildItem function:
# dot source your script to load it to the current runspace
. "C:\someScript.ps1"
$scriptFunctions = Get-ChildItem function: | Where-Object { $currentFunctions -notcontains $_ }

$scriptFunctions | ForEach-Object {
      & $_.ScriptBlock
}

Что касается этого ...

Спасибо, это то, что я хочу, но в нем также отображаются такие функции, как A :, B :, Get-Verb, Clear-Host, ...

Это по замыслу. Если вы хотите это по-другому, то вы должны это кодировать. Чтобы получить имя функции в любом скрипте, он должен быть сначала загружен в память, затем вы можете поставить точку в определении и получить внутренние компоненты. Если вам просто нужны имена функций, вы можете использовать их для получения регулярных выражений.

Или просто ...

Function Show-ScriptFunctions
{
    [cmdletbinding()]
    [Alias('ssf')]

    Param 
    (
        [string]$FullPathToScriptFile
    )


    (Get-Content -Path $FullPathToScriptFile) | 
    Select-String -Pattern 'function'
}

ssf -FullPathToScriptFile 'D:\Scripts\Format-NumericRange.ps1'

# Results
<#
function Format-NumericRange 
function Flush-NumberBuffer 
#>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...