mayho33
Goto Top

Powershell Return-Value System.Array zu String

Hi @ All

Ich bastel etwas mit Powershell und verzweifle gleich an diesem besch... Object-Referenzing, weil ich es einfach nicht gebacken bekomme das Return-Value zu einem stinknormalen string umzuwandeln. Hat jemand eine Idee dazu?

Ziel:
Ich lese aus einer MSI die Property-Table und gebe ein bestimmtes Property zurück. Check! Das geht!
[Flags()] enum ENUM_MSIProperties
{
    byMSI = 1
    byMSP = 2
}

Function Get-MSIProperties() {
    [CmdletBinding()]
    param (
	[Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [IO.FileInfo]$FilePath,
        [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [ENUM_MSIProperties]$Filter,
        [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [string]$PropertyName
    )
        
    <#
    MSI:
        "ProductCode" "ProductName" "ProductVersion" "ProductLanguage" "Manufacturer" "ProductCPU"   

     MSP:
          "TargetProductName" "ManufacturerName" "DisplayName" "ProductLanguage" "Description" "Classification"  
    #>
    $com_object = New-Object -com WindowsInstaller.Installer
    if($Filter -eq [ENUM_MSIProperties]::byMSI)
    {
        [int]$init = 0
        [int]$row = 2
        $query = "SELECT * FROM Property WHERE Property = '$($PropertyName)'"  
    }

    if($Filter -eq [ENUM_MSIProperties]::byMSP)
    {
        [int]$init = 32
        [int]$row = 3
        $query = "SELECT * FROM MsiPatchMetadata WHERE Property = '$($PropertyName)'"  
    }
    $database = $com_object.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $Null, $com_object, @($FilePath.FullName, $init))  
    $View     = $database.GetType().InvokeMember("OpenView","InvokeMethod",$Null,$database,($query))  

    $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)   
    
    $record   = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null)   
    $t = $record.GetType()
    (($record.stringdata($row) -replace "`n|`r|`t") -join ',')  
    
}

Mein Problem:

Ich rufe die oben genannte Function (Get-MSIProperties) aus einer anderen Function auf und möchte das Return-Value weiterverarbeiten.
AAABER! Ich bekomme zwar eine schöne Ausgabe in der Console...

powershella

...aber ich kann den Sch... nicht weiterverarbeiten, weil die schöne Ausgabe tatsächlich sowas ist:

Vor dem Return:
powershellc

Nach dem Return:
powershellb

Und egal was ich mache (casting, usw.), es wird einfach kein String daraus (??)

Hat jemand eine Idee dazu?

Danke für die Unterstützung!

Mayho


EDIT:

Oh WOW!!!! Kann das Echt sein??

Ich bekomme hier also ein komisches System.Array
$msiProductCodes = Get-MSIProperties -FilePath $msiPathes[-1] -Filter 'byMSI' -PropertyName "ProductName"  

Dann spiele ich nochmal blöd rum...
([string]$msiProductCodes.GetEnumerator()).gettype()

...und plötzlich ist es ein String!
powershelld


Bei den ca. 50000 Versuchen vorher nicht. Ich werd' echt wahnsinnig!

Content-ID: 631530

Url: https://administrator.de/contentid/631530

Ausgedruckt am: 23.11.2024 um 22:11 Uhr

146707
Lösung 146707 13.12.2020 aktualisiert um 23:11:05 Uhr
Goto Top
In Zeile 39 gibst du schon was aus der Funktion zurück weil du dessen Ergebnis nicht nach null umleitest oder es einer Variablen zuweist, dein letzter Return in Zeile 43 ist dann eben nur ein weiteres Objekt was du aus deiner Funktion zurück gibst deswegen ist das Ergebnis der Funktion ein Object-Array und kein reiner String weil du eben zwei mal was zurück gibst 😉.
In deinem Beispiel wäre also
$msiProductCodes[1]
der Return-Value aus Zeile 43 (der String den du haben willst) und
$msiProductCodes
der Rückgabewert des Funktionsaufrufes aus Zeile 39 den du irrtümlicherweise nicht z.B. via [void] oder out-null ins Nirvana leitest sondern eben ausgibst und dieser dann Teil des Return-Values der Function wird.
mayho33
mayho33 13.12.2020 um 23:43:52 Uhr
Goto Top
Zitat von @146707:

In Zeile 39 gibst du schon was aus der Funktion zurück weil du dessen Ergebnis nicht nach null umleitest ...

Mann! Bin ich blöd! Genau das wars!

Danke für die Schnelle Hilfe!

Grüße!