2016-11-03 2 views
2

J'ai une question simple. J'ai expérimenté avec Powershell DSC et j'ai créé une ressource personnalisée pour changer la lettre de lecteur de CD d'une machine cliente.Puis-je partager des variables entre les méthodes get, set et test dans une ressource DSC personnalisée?

Mon code actuel fonctionne, mais j'aimerais voir si cela peut être plus efficace. Voir mon code ci-dessous:

enum Ensure 
{ 
    Absent 
    Present 
} 

[DscResource()] 
class ChangeCDDriveLetter { 

[DscProperty(Key)] 
[string]$RequiredCDDriveLetter 
[DscProperty(NotConfigurable)] 
[string]$CurrentCDDriveLetter 
[DscProperty(NotConfigurable)] 
[string]$CurrentCDVolume 

[ChangeCDDriveLetter] Get() { 

    $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    Return $This 

} 

[Void] Set(){ 

    $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    mountvol $This.CurrentCDDriveLetter /d 
    mountvol $This.RequiredCDDriveLetter $This.CurrentCDVolume 

} 

[bool] Test(){ 

    $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    Write-Verbose ("Current CD drive letter is: " + $This.CurrentCDDriveLetter) 

    if ($This.CurrentCDDriveLetter -ne $This.RequiredCDDriveLetter){ 

     Write-Verbose ("The CD drive letter should be: " + $This.RequiredCDDriveLetter) 
     Write-Verbose ("Setting the CD drive letter to: " + $This.RequiredCDDriveLetter) 
     Return $False 
    } 
    else { 

     Write-Verbose "This is the correct drive letter." 
     Return $True 

    }  
} 

[string] CheckCurrentDriveLetter(){ 

    $CurrentDriveLetter = (Get-WmiObject win32_logicaldisk -filter 'DriveType=5').DeviceID 
    return $CurrentDriveLetter 

} 

[string] CheckCurrentVolume($DriveLetter){ 

    $Volume = (mountvol $DriveLetter /l).Trim() 
    Return $Volume 

} 

}

Ma question est sur la ligne récurrente suivante:

$This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 

Comme vous pouvez le voir, ces informations sont recueillies dans le Set, Get et méthodes d'essai .

Est-il possible de rassembler cette information une fois et de partager cette information avec les autres méthodes?

Donc, je regrouperais les informations dans la méthode de test, et passerais cette information à la méthode Set? Je suppose que cela n'aura pas vraiment d'effet sur la ressource actuelle, mais j'aimerais quand même savoir si c'est possible afin que je puisse l'utiliser dans les ressources futures pour les rendre aussi efficaces que possible.

Merci d'avance!

Cordialement, Bob Smienk

Répondre

0

Vous ne devriez pas supposer que vous aurez la même instance chaque fois DSC fonctionne vous ressource. Par conséquent, il n'y a aucun bon moyen pour avoir un champ d'instance ou une propriété d'instance persister entre les exécutions.

Si la valeur est statique sur la machine, vous pouvez essayer de la stocker dans un champ statique, mais ne supposez pas non plus que l'ordre dans lequel les méthodes sont appelées.

0

Ce que j'ai fait et ce que je ferais est basé sur la POO. Appelez Get() au début de vos méthodes Test() et Set(), définissant ainsi la propriété:

[DscResource()] 
class ChangeCDDriveLetter { 

[DscProperty(Key)] 
[string]$RequiredCDDriveLetter 
[DscProperty(NotConfigurable)] 
[string]$CurrentCDDriveLetter 
[DscProperty(NotConfigurable)] 
[string]$CurrentCDVolume 

[ChangeCDDriveLetter] Get() { 

    $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    Return $This 

} 

[Void] Set(){ 

    $This.Get() 

    # Replaced by $This.Get() 
    # $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    # $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    mountvol $This.CurrentCDDriveLetter /d 
    mountvol $This.RequiredCDDriveLetter $This.CurrentCDVolume 

} 

[bool] Test(){ 

    $This.Get() 

    # Replaced by $This.Get() 
    # $This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 
    # $This.CurrentCDVolume = $This.CheckCurrentVolume($This.CurrentCDDriveLetter) 

    Write-Verbose ("Current CD drive letter is: " + $This.CurrentCDDriveLetter) 

    if ($This.CurrentCDDriveLetter -ne $This.RequiredCDDriveLetter){ 

     Write-Verbose ("The CD drive letter should be: " + $This.RequiredCDDriveLetter) 
     Write-Verbose ("Setting the CD drive letter to: " + $This.RequiredCDDriveLetter) 
     Return $False 
    } 
    else { 

     Write-Verbose "This is the correct drive letter." 
     Return $True 

    }  
} 
}