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!
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...
...aber ich kann den Sch... nicht weiterverarbeiten, weil die schöne Ausgabe tatsächlich sowas ist:
Vor dem Return:
Nach dem Return:
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
Dann spiele ich nochmal blöd rum...
...und plötzlich ist es ein String!
Bei den ca. 50000 Versuchen vorher nicht. Ich werd' echt wahnsinnig!
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...
...aber ich kann den Sch... nicht weiterverarbeiten, weil die schöne Ausgabe tatsächlich sowas ist:
Vor dem Return:
Nach dem Return:
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!
Bei den ca. 50000 Versuchen vorher nicht. Ich werd' echt wahnsinnig!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 631530
Url: https://administrator.de/contentid/631530
Ausgedruckt am: 23.11.2024 um 22:11 Uhr
2 Kommentare
Neuester Kommentar
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
der Return-Value aus Zeile 43 (der String den du haben willst) und
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.
In deinem Beispiel wäre also
$msiProductCodes[1]
$msiProductCodes