Принимать входные данные конвейера непосредственно к выходным данным - PullRequest
0 голосов
/ 17 ноября 2018

Я хочу выполнить / связать несколько командлетов PowerShell.Первоначальный вклад от CSV.В CSV может быть больше значений, чем необходимо для начальной команды, но они могут понадобиться в дальнейшем.Например:

 CSV
 email, fname, lname, clubNo, permission
 A@email.com, John, Smith, 12, R
 B@email.com, Jean, Smith, 12, R
 C@email.com, Jack, Smith, 12, R

Затем цепочка

 import-csv file.txt | new-user -env Dev | set-role | export-csv result.txt

новому пользователю нужна только электронная почта, env set-role нужна электронная почта, clubNo, env и perm

Iдумал, что мой новый командлет должен выглядеть примерно так, но он не работает:

function global:new-user {
param(  
    [Parameter(ValueFromPipelineByPropertyName = $true, mandatory = $true)][validateset('DEV', 'QA', 'PT', 'PLT', 'SIT', 'APIS', 'PD', 'Sandbox')][STRING]$env,
    [Parameter( mandatory = $True, ValueFromPipelineByPropertyName = $true)][ValidateScript({ValidateEmail($_)})][String]$Email,
    [String]$userKey="xyz",
    [String]$secret="abc"
) 

Begin {
    $dc = "domain.com"
    $auth = "env=$env&userkey=$userKey&secret=$secret"
    $record = New-Object psobject
    $record | add-member env $env
}

process {
    $result = Invoke-RestMethod "https://accounts.$dc/accounts.search?$auth" -Method Post -Body @{"query" = "select UID FROM accounts where profile.email contains '$Email'"}
    If (-not $result.errorCode ) {
        $record | Add-Member uid $result.uid
    }
    $record | Add-Member ErrorCode $result.errorCode -Force
}

end {
    Write-Output $rescord
}

}

Но я вижу только одну запись в исходящем конвейере

1 Ответ

0 голосов
/ 18 ноября 2018

Блок Begin / End вызывается один раз во время выполнения командлета, поэтому вы просто создаете объект $ record в начале, перезаписываете его свойства в блоке процесса и отправляете его по конвейеру один раз в конце. Вы также не сохраняете другие свойства из файла CSV. Я думаю, вам просто нужно сделать все в блоке процесса, и вместо того, чтобы создавать новый объект, просто продолжайте использовать входной объект ($ _)

begin {
   $dc = "domain.com"
   $auth = "env=$env&userkey=$userKey&secret=$secret"
}
process {

    $_ | add-member env $env
    $result = Invoke-RestMethod "https://accounts.$dc/accounts.search?$auth" -Method Post -Body @{"query" = "select UID FROM accounts where profile.email contains '$Email'"}
    If (-not $result.errorCode ) {
        $_ | Add-Member uid $result.uid
    }
    $_ | Add-Member ErrorCode $result.errorCode -Force
    Write-Output $_
}
end {}
...