Scripts/DSC2/Mod4/ClassStructure.ps1
# From release notes enum Ensure { Absent Present } <# This resource manages the file in a specific path. [DscResource()] indicates the class is a DSC resource #> [DscResource()] class FileResource { <# This property is the fully qualified path to the file that is expected to be present or absent. The [DscProperty(Key)] attribute indicates the property is a key and its value uniquely identifies a resource instance. Defining this attribute also means the property is required and DSC will ensure a value is set before calling the resource. A DSC resource must define at least one key property. #> [DscProperty(Key)] [string]$Path <# This property indicates if the settings should be present or absent on the system. For present, the resource ensures the file pointed to by $Path exists. For absent, it ensures the file pointed to by $Path does not exist. The [DscProperty(Mandatory)] attribute indicates the property is required and DSC will guarantee it is set. If Mandatory is not specified or if it is defined as Mandatory=$false, the value is not guaranteed to be set when DSC calls the resource. This is appropriate for optional properties. #> [DscProperty(Mandatory)] [Ensure] $Ensure <# This property defines the fully qualified path to a file that will be placed on the system if $Ensure = Present and $Path does not exist. NOTE: This property is required because [DscProperty(Mandatory)] is set. #> [DscProperty(Mandatory)] [string] $SourcePath <# This property reports the file's create timestamp. [DscProperty(NotConfigurable)] attribute indicates the property is not configurable in a DSC configuration. Properties marked this way are populated by the Get() method to report additional details about the resource when it is present. #> [DscProperty(NotConfigurable)] [Nullable[datetime]] $CreationTime <# This method is equivalent to the Set-TargetResource script function. It sets the resource to the desired state. #> [void] Set() { $fileExists = $this.TestFilePath($this.Path) if($this.ensure -eq [Ensure]::Present) { if(-not $fileExists) { $this.CopyFile() } } else { if($fileExists) { Write-Verbose -Message "Deleting the file $($this.Path)" Remove-Item -LiteralPath $this.Path -Force } } } <# This method is equivalent to the Test-TargetResource script function. It should return True or False, showing whether the resource is in a desired state. #> [bool] Test() { $present = $this.TestFilePath($this.Path) if($this.Ensure -eq [Ensure]::Present) { return $present } else { return -not $present } } <# This method is equivalent to the Get-TargetResource script function. The implementation should use the keys to find appropriate resources. This method returns an instance of this class with the updated key properties. #> [FileResource] Get() { $present = $this.TestFilePath($this.Path) if ($present) { $file = Get-ChildItem -LiteralPath $this.Path $this.CreationTime = $file.CreationTime $this.Ensure = [Ensure]::Present } else { $this.CreationTime = $null $this.Ensure = [Ensure]::Absent } return $this } <# Helper method to check if the file exists and is the right file #> [bool] TestFilePath([string] $location) { $present = $true $item = Get-ChildItem -LiteralPath $location -ea Ignore if ($item -eq $null) { $present = $false } elseif( $item.PSProvider.Name -ne "FileSystem") { throw "Path $($location) is not a file path." } elseif($item.PSIsContainer) { throw "Path $($location) is a directory path." } return $present } <# Helper method to copy file from source to path #> [void] CopyFile() { if(-not $this.TestFilePath($this.SourcePath)) { throw "SourcePath $($this.SourcePath) is not found." } [System.IO.FileInfo] $destFileInfo = new-object System.IO.FileInfo($this.Path) if (-not $destFileInfo.Directory.Exists) { Write-Verbose -Message "Creating directory $($destFileInfo.Directory.FullName)" # use CreateDirectory instead of New-Item to avoid code # to handle the non-terminating error [System.IO.Directory]::CreateDirectory($destFileInfo.Directory.FullName) } if(Test-Path -LiteralPath $this.Path -PathType Container) { throw "Path $($this.Path) is a directory path" } Write-Verbose -Message "Copying $($this.SourcePath) to $($this.Path)" #DSC engine catches and reports any error that occurs Copy-Item -LiteralPath $this.SourcePath -Destination $this.Path -Force } } |