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-Key: 631530

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

Printed on: May 28, 2023 at 09:05 o'clock

Mitglied: 146707
Solution 146707 Dec 13, 2020 updated at 22:11:05 (UTC)
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.
Member: mayho33
mayho33 Dec 13, 2020 at 22:43:52 (UTC)
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!