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

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

Printed on: April 23, 2024 at 12:04 o'clock

Member: SeaStorm
SeaStorm Dec 14, 2020 updated at 19:59:18 (UTC)
Goto Top
Hi

zu 2:

enum OS {
Windows
Linux
}

function Select-OS
{
    param
    (
    [OS]
    [Parameter(Mandatory=$false)]
    $Name = [OS]::Windows
    )
    "Parameter: $Name"  
}
Member: mayho33
mayho33 Dec 14, 2020 at 23:56:54 (UTC)
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!
Member: mayho33
mayho33 Dec 22, 2020 at 01:29:39 (UTC)
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!