Как создать функцию с помощью Powershell - PullRequest
0 голосов
/ 12 октября 2019

Мне нужна помощь с кодом ниже. Я хочу, чтобы скрипт выполнял следующее: запрашивал у пользователя имя группы AD, если имя группы найдено, экспортируйте членов группы в файл CSV. одно из требований заключается в том, что я должен включить оператор функции. Заранее спасибо.

Код работает, если я использую переменную, как в следующем примере: $ groupsusers = Get-ADGroup -Identity $ nameofgroup вместо оператора функции. Однако я не хочу использовать переменную, я хочу реализовать оператор функции.

$prompt = "Enter A Group Name"
do
{
$nameofgroup = Read-Host $prompt
}
until(!$(dsquery Group-Object $nameofgroup; $prompt = "Group 
'$nameofgroup' was not found, try again"))

$nameofgroup = Read-Host $prompt

function GetGroupInfoToCsv (#what parameters go here?){

ForEach-Object{

$settings = @{ Group = $_.DistinguishedName; Member = $null }
$_| Get-ADGroupMember |
ForEach-Object{
    $settings.Member = $_.DistinguishedName
    New-Object PsObject -Property $settings
}

}

}

GetGroupInfoToCsv | Export-Csv .\GroupMembers.csv -NoTypeInformation

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Вы можете объединить запрос ввода пользователя и возвращение информации в одну и ту же функцию. Примерно так:

function Get-GroupMembers {
    $prompt = "Enter A Group Name. Press Q to quit"
    # create an endless loop
    while ($true) {
        Clear-Host
        $answer = Read-Host $prompt
        # if the user has had enough, exit the function
        if ($answer -eq 'Q') { return }

        # try and find one or more AD groups using the answer as (part of) the name
        $group = Get-ADGroup -Filter "Name -like '*$answer*'"
        # if we have found something, exit the while loop and start enumerating the members
        if ($group) { break }

        $prompt = "Group '$answer' was not found, try again. Press Q to quit"
    }

    # you only get here if Get-ADGroup found one or more groups
    $group | ForEach-Object {
        # output a PSObject with the properties you are after
        $members = $_ | Get-ADGroupMember
        foreach ($member in $members) {
            [PsCustomObject]@{
                'Group'  = $_.DistinguishedName
                'Member' = $member.DistinguishedName
            }
        }
    }
}

# call the function
$groupinfo = Get-GroupMembers
# test if the function returned anything. 
# the user could have cancelled of the group had no members to output
if ($groupinfo) {
    Write-Host "Adding $($groupinfo.Count) items to the CSV file"
    # without -Append, you would overwrite your CSV file..
    $groupinfo | Export-Csv .\GroupMembers.csv -NoTypeInformation -Append
}
else {
    Write-Host 'Nothing found..'
}

Как видите, я изменил имя функции, чтобы оно соответствовало Verb-Noun соглашению в PowerShell.

0 голосов
/ 12 октября 2019

Хорошо, из моей интерпретации кажется, что вы хотите использовать функцию для передачи функции Export-Csv в качестве источника данных. Из того, что я вижу в приведенном выше коде, вы экспортируете функцию GetGroupInfoToCsv при экспорте CSV, но функция ничего не возвращает, поэтому нет данных, которые хранятся в CSV.

Выпотребуется вернуть данные в этой функции, например, массив объектов. Вот пример, как это сделать:

function test () 
{ 
    return @([pscustomobject]@{test="test1"})
} 
test | Export-Csv -NoTypeInformation -Path [YOUR_PATH_HERE]
...