@mdkolpakov

Почему переменная перестала выводить ответ?

Здравствуйте!
Есть скрипт, который позволяет перемещаться по каталогам и определять список групп, которые имеют к нему доступ.
Сам скрипт:
function Get-Srv($srv_name){ #Получаем на вход имя сервера. На каждом сервере есть определенная папка \Folder, которая подставляется в Get-Children. 
    $kat_addr = '\\' + $srv_name + '\Folder'
    Get-Children -Path $kat_addr | Format-table Name
    Get-Kat
}

function Get-Kat { #После того, как увидели все каталоги, можем выбрать один из них и увидеть список групп, с исключениями
    $inp_res = Read-Host "Введите ресурс или 1"
    if ($inp_res -ne 1)
    {
    $kek = $kat_addr + '\' + $inp_res
    $lol2 = Get-Acl $kek
    $lol2 = $lol2.Access | Where-Object ` 
    {
    $_.IdentityReference -notlike "*blabla1*" -and` 
    $_.IdentityReference -notlike "*blabla2*" -and` 
    $_.IdentityReference -notlike "*blabla3*" -and` 
    $_.IdentityReference -notlike "*blabla4*" -and` 
    $_.IdentityReference -notlike "*blabla5*"}
    $lol2 #Вот этот самый вывод
    }
    else
    {
    Get-Srv
    }
 }

 $param = Read-Host "Введите сервер"
 Get-Srv($param)


Всё работает хорошо. Но хотелось бы сделать так, чтобы в конце выполнения функции Get-Kat снова вызывалась Get-Srv.

Для этого я попробовал следующее

$lol2 = $lol2.Access | Where-Object ` 
    {
    $_.IdentityReference -notlike "*blabla1*" -and` 
    $_.IdentityReference -notlike "*blabla2*" -and` 
    $_.IdentityReference -notlike "*blabla3*" -and` 
    $_.IdentityReference -notlike "*blabla4*" -and` 
    $_.IdentityReference -notlike "*blabla5*"}
    $lol2 #Вот этот самый вывод
    Get-Srv


После такого преобразования, $lol2 не выводит список групп с исключениями, а меня сразу перебрасывает на Get-Srv. Пытался дублировать $lol2, использовать Write-Host и ставил задержку. Но после добавления Get-Srv перестаёт выводиться отфильтрованный список.

Вызов одной функции из другой не очень правильное решение, но очень интересно, почему так происходит?

Подскажите пожалуйста.
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
У вас так всё намешано...
Где-то forma-table, где-то просто "вывод", где-то чтение с хоста.
Get-Srv($param), который в случае двух параметров превратится в массив...
Не выводится, скорее всего, потому, что PS очень хочет вам угодить, пытаясь подстроить вывод. Но не может :)

Я бы предложил хорошенько поработать над структурой, убрать рекурсию и правильно разделить ответственность между функциями
типа
function Show-SrvFolderList($kat_addr) { # Получаем на вход уже готовый путь к серверу
    Get-Children -Path $kat_addr | Format-Table Name
}
function Show-FolderAccess($inp_res) { #  увидеть список групп, с исключениями
    $lol2 = Get-Acl $inp_res
    $lol2 = $lol2.Access | Where-Object {
        $_.IdentityReference -notlike "*blabla1*" -and
        $_.IdentityReference -notlike "*blabla2*" -and 
        $_.IdentityReference -notlike "*blabla3*" -and 
        $_.IdentityReference -notlike "*blabla4*" -and 
        $_.IdentityReference -notlike "*blabla5*"
    }
    $lol2 | Format-Table
}

$srv_name = Read-Host "Введите сервер"
$kat_addr = '\\' + $srv_name + '\Folder' # На каждом сервере есть определенная папка \Folder, которая подставляется в Get-Children. 
do {
    Show-SrvFolderList
    # После того, как увидели все каталоги, можем выбрать один из них
    $inp_res = Read-Host "Введите ресурс или 1"
    if ($inp_res -eq '1') { break }
    Show-FolderAccess ($kat_addr + '\'  + $inp_res)
} while ($true)


Функции переименованы, чтобы было понятно что они делают
Причём они Show, а не Get, потому что на самом деле они ничего не возвращают, а только показывают
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alex_Geer
@Alex_Geer
System Engineer
Ну наверное $kat_addr, объявленная в функции Get-Srv, недоступна в функции Get-Kat.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы