2016-11-03 18 views
2

我有一個簡單的問題。我一直在使用Powershell DSC進行實驗,並創建了一個自定義資源來更改客戶端計算機的CD驅動器號。我可以在自定義DSC資源中的get,set和測試方法之間共享變量嗎?

我目前的代碼工作,但我想看看它可以更有效。見我下面的代碼:

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 

} 

}

我的問題是關於以下的重複行:

$This.CurrentCDDriveLetter = $This.CheckCurrentDriveLetter() 

正如你所看到的,這個信息在設置收集,獲取和測試方法。

是否可以收集一次該信息並在其他方法之間共享此信息?

所以我會收集測試方法中的信息,並將這些信息傳遞給Set方法?我想這樣做對目前的資源並沒有太大的影響,但我仍然想知道這是否可行,以便我可以在未來的資源中使用它,使它們儘可能高效。

在此先感謝!

親切的問候, 鮑勃Smienk

回答

0

你不應該假定你們每個人都DSC運行你的資源時具有相同的實例。因此,有沒有好方法有一個實例字段或實例屬性持續執行之間。

如果該值對機器是靜態的,則可以嘗試將其存儲在靜態字段中,但不應再假定調用方法的順序。

0

我做了什麼,而且會做的是基於OOP。在Test()和Set()方法的開頭調用Get(),從而設置屬性:

[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 

    }  
} 
} 
相關問題