Я очень привык к Python, где функции можно помещать в классы и вызывать отдельно.
Однако теперь мне нужно что-то закодировать в PowerShell, и я не могу найти способ, возможно ли что-то подобное здесь.
Пример того, что я пытаюсь сделать:
function a {
Write-Host "a"
function a_1() { Write-Host "a_1" }
function a_2() { Write-Host "a_2" }
}
a # Works
a.a_1 # Doesn't works
a_2 # Doesn't works
Возможно, вы ищете Модули PowerShell; они не позволяют вам использовать функции гнездо таким образом, но они позволяют группировать функции вместе
Это проблема области действия — функции a_1
и a_2
определены в области действия a
и, таким образом, перестают существовать после возврата функции. Вы можете сохранить их в области вызова с помощью оператора вызова .
точка-источник: . a; a_1; a_2
PowerShell (5 и выше) поддерживает классы (см. about_Classes), и методы класса могут быть статическими.
Так, например:
class a {
a() {
Write-Host "a"
}
static [void]a_1()
{
Write-Host "a_1"
}
static [void]a_2()
{
Write-Host "a_2"
}
}
[a]$a = [a]::new()
[a]::a_1()
[a]::a_2()
Выход:
a
a_1
a_2
Only if the inner function have a scope modifier, i.e.: function script:a_1() { ... } or function global:a_2() { ... } – Santiago Squarzon
Спасибо! Это кажется достаточно близким к тому, что я ищу, в сочетании с творческим наименованием функций это позволяет получить то, к чему я привык.
Решение для меня:
function a {
Write-Host "a"
function script:a.a_1() { Write-Host "a_1" }
function script:a.a_2() { Write-Host "a_2" }
}
a # Call this so the functions get loaded
a.a_1 # Creative naming so it acts like I need it
a.a_2
На самом деле то, что предложил Матиас, гораздо элегантнее, чем изменение области действия внутренней функции.
Только если внутренняя функция имеет модификатор области видимости, то есть:
function script:a_1() { ... }
илиfunction global:a_2() { ... }