mayho33
Goto Top

Powershell CmdLet mit Enum 2 Fragen

Hi @ All

Auf die Gefahr hin, dass ich mich wieder mal zum Affen mache, habe ich 2 Fragen zu PS 5 mit Enums und hoffe wieder mal auf eure Hilfe

Frage 1:
Es kommt teilweise vor, dass PS mein Enum nicht mehr erkennt. Bedeutet: Kein Intellisence und Fehlermeldung, dass das Enum unbekannt sei (??). Die einzige Lösung die ich bisher finden konnte war, den PC neu zu starten. Ist natürlich kompletter Schmarn.

Kann mir dazu jemand einen Tipp geben wo es hakt?
[Flags()] enum ENUMFileTypeSelection {
    MSI       = 1
    MSP       = 2
    MST       = 4
    MSIAndMSP = 8
    EXE       = 16
}


Function Get-MSIProperties() {
    [CmdletBinding()]
    param (
	[Parameter(Mandatory= $true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [System.IO.FileInfo]$FilePath,
        [Parameter(Mandatory= $true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [ENUMFileTypeSelection]$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 [ENUMFileTypeSelection]::MSI)
    {
        [int]$init = 0
        [int]$row = 2
        $query = "SELECT * FROM Property WHERE Property = '$($PropertyName)'"  
    }

    if($Filter -eq [ENUMFileTypeSelection]::MSP)
    {
        [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))  
    $dummy    = $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)   
    $record   = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null)   

    (($record.stringdata($row) -replace "`n|`r|`t") -join ',').Trim(' ')  
}

$pVersion = Get-MSIProperties -FilePath $MSIFiles -Filter 'MSI'  -PropertyName "ProductVersion"  

Frage 2:
wenn man das Property mit Mandatory=$false definiert...
[Parameter(Mandatory= $false)[MyEnum]$Select
...ist es ja eigentlich $null.
Ich habe es aber noch nicht geschaft einen Standard zu definieren. Etwa wie bei...
 [ValidateSet("A","B")]$Select= 'A'  

Kann mir da jemand einen Tipp geben wie ich das mit Enums mache?

Danke für die Unterstützung!

Mayho

Content-ID: 631606

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

Ausgedruckt am: 23.11.2024 um 22:11 Uhr

SeaStorm
SeaStorm 14.12.2020 aktualisiert um 20:59:18 Uhr
Goto Top
Hi

zu 2:

enum OS {
Windows
Linux
}

function Select-OS
{
    param
    (
    [OS]
    [Parameter(Mandatory=$false)]
    $Name = [OS]::Windows
    )
    "Parameter: $Name"  
}
mayho33
mayho33 15.12.2020 um 00:56:54 Uhr
Goto Top
Zitat von @SeaStorm:

Hi

Hi!

zu 2:

> enum OS {
> Windows
> Linux
> }
> 
> function Select-OS
> {
>     param
>     (
>     [OS]
>     [Parameter(Mandatory=$false)]
>     $Name = [OS]::Windows
>     )
>     "Parameter: $Name"  
> }
> 

Hmm! Ja! Dachte ich auch! Aber habe ich bis jetzt nur mit "manueller" Eingabe hinbekommen und dann aber einen Error bekommen ala:

BlaBlaBla konnte nicht aufgelöst werden... Parameterevaluation-Exception irgendwas...

Ich werde mal mein CmdLet umstrukturieren. Vielleicht liegts daran.

Danke inzwischen!
mayho33
mayho33 22.12.2020 um 02:29:39 Uhr
Goto Top
Habe nun eine Lösung gefunden. Siehe dazu:

Powershell 5.x Custom-Enum-Parameter mit TAB verfügbar machen

Danke für die Unterstützung!