【问题标题】:Take Pipeline input write directly to pipeline output将管道输入直接写入管道输出
【发布时间】:2018-11-17 16:33:19
【问题描述】:

我想执行/链接多个 PowerShell cmdlet。来自 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

新用户只需要电子邮件,环境 set-role 需要 email、clubNo、env 和 perm

我认为我的新用户 cmdlet 应该看起来像这样,但它不起作用:

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
}

}

但我在出站管道上只看到一条记录

【问题讨论】:

  • 我想你只需要这个:import-csv file.txt | foreach { 做你需要做的 } |导出-csv result.txt
  • 我修改了我的原件,以更能反映我的实际情况

标签: powershell pipeline


【解决方案1】:

Begin/End 块在 cmdlet 执行期间被调用一次,因此您只需在开始时创建一个 $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 {}

【讨论】: