Ich bin in Powershell v4.0. Ich habe ein Dropdown-Menü auf meiner Benutzeroberfläche, das ich mit Daten aus meiner Datenbank bearbeite. Ich nenne eine Funktion, die Daten wie so packt:Powershell Einreihige Datentabelle zurück zu füllen Combobox
$ConfigDynamicContractID.ItemsSource = (GetDynamicContracts).DefaultView
Auf dem Backend es wie folgt aussieht:
function GetDynamicContracts{
$ContractQuery = "select con.ContractNumber as Name, c.ContractID from foo..campaign c inner join foo..campaigntemplate ct on c.campaignid = ct.campaignid
inner join foo..template t on ct.templateid = t.templateid inner join bar..contracts con on con.ContractID = c.ContractID
where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0"
$ContractResult = ExecuteSelect "Bar" $ContractQuery
return , $ContractResult
}
Dieser Code funktioniert gut. Mir wurde dann gesagt, dass die Tabellen, auf die oben verwiesen wird, nicht miteinander sprechen können, so dass ich individuelle Anrufe an jedes einzelne tun muss und in Powershell filtern muss. Also hier ist mein Code dafür:
function GetDynamicContracts{
$CampaignQuery = "Select c.* From foo..Campaign c join foo..CampaignTemplate ct on c.CampaignID = ct.CampaignID
join foo..Template t on ct.TemplateID = t.TemplateID
Where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0"
$CampaignResults = ExecuteSelect "foo" $CampaignQuery
$ContractIDs = New-Object System.Collections.ArrayList
foreach($row in $CampaignResults.Rows){
$ContractIDs.Add($row.ContractID)
}
$ContractIDs = $ContractIDs -join ","
$PHQuery = "Select ContractID, ContractNumber as Name From Contracts Where ContractID in ($ContractIDs)"
$PHResults = ExecuteSelect "Bar" $PHQuery
#Log $MyInvocation.MyCommand $PSBoundParameters
return ,$PHResults
}
Dieser Code aus irgendeinem Grund funktioniert nicht, wenn Sie eine einzelne Zeile zurückgeben. Aber wenn ich diesen Funktionsaufruf in zwei getrennte teile, dann klappt es. Siehe unten:
function GetDynamicContracts{
$ContractIDs = GetDynamicCampaign
$ContractIDs = $ContractIDs[1]
$PHQuery = "Select ContractID, ContractNumber as Name From Contracts Where ContractID in ($ContractIDs)"
$PHResults = ExecuteSelect "PhytelMaster" $PHQuery
Log $MyInvocation.MyCommand $PSBoundParameters
return ,$PHResults
}
function GetDynamicCampaign{
$CampaignQuery = "Select c.* From Campaign..Campaign c join Campaign..CampaignTemplate ct on c.CampaignID = ct.CampaignID
join Campaign..Template t on ct.TemplateID = t.TemplateID
Where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0"
$CampaignResults = ExecuteSelect "Campaign" $CampaignQuery
$ContractIDs = New-Object System.Collections.ArrayList
foreach($row in $CampaignResults.Rows){
$ContractIDs.Add($row.ContractID)
}
$ContractIDs = $ContractIDs -join ","
return $ContractIDs
}
Es scheint, dass zwei wählt in einer einzigen Funktion ausführen zu machen bewirkt, dass die ‚‘ zum Scheitern verurteilt zu tun, was er tut, wenn die Daten zurück. Kann mir jemand erklären warum? Vielen Dank im Voraus und da ich einen Workaround habe, gibt es keine Eile.
ArrayList.add Spams in der Ausgabe mit dem hinzugefügten Item-Index, und AFAIK sollte immer unterdrückt werden, unabhängig von 'return' Anweisungen mit'> $ null' oder '| Out-Null'. Sag es einfach. – wOxxOm
PowerShell-Funktionen geben alles an die Pipeline aus, die sonst nicht umgeleitet wird. Das Schlüsselwort 'Return' ist redundant und überflüssig. Wenn ich also die 'Add'-Methode einer' ArrayList' suche ([hier] (https://msdn.microsoft.com/en-us/library/system.collections.arraylist.add%28v=vs.110%29 .aspx? f = 255 & MSPPError = -2147217396)) zeigt, dass die Methode den Index des hinzugefügten Elements ausgibt. Wenn das nicht umgeleitet wird, erhalten Sie diese 'Int'-Ausgabe zusätzlich zu allem, was Sie sonst noch brauchen, in die Pipeline. – TheMadTechnician
Vielen Dank für Ihre Antworten. Dies ist ein eher ärgerlicher Aspekt von Powershell. Ich fand in einem anderen Thread, dass, wenn ich den Code in meiner Funktion mit $ null = @ {'do code}} und dann am Ende, wenn ich die Rückgabe (return $ a) wickeln, dann nur $ a zurückgibt. Es ist hässlich, aber scheint keine Hanky Panky mit Powershell zu garantieren. – SuperVillainPresident