我创建了一个DSC资源来复制某个源的Modules目录。 我正在测试它在我的环境中进行更广泛的部署。 资源确实很好,确保所有文件都存在,并且它们与源内容相匹配,到目前为止一切都很好......

问题是这样的; 我想确保如果目标或目标中有任何其他文件,则删除它们的文件夹。

这是我的代码:

Configuration TestRun
{
  Param 
    (
      $ComputerName = 'Localhost'
    )
  Node $ComputerName
    {
      File LoadModules
        {
          Ensure = 'Present'
          Type = 'Directory'
          Force = $true
          Recurse = $true
          SourcePath = "C:\git\Modules"
          DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules'
          Checksum = "SHA-256"
          MatchSource = $true
        }
    }
}

在第一次运行配置后,我一直在目的地目录中创建一个名为Deleteme.flag的文件进行测试。 到目前为止,我还没有运气实际被删除。

我尝试添加一个额外的文件提供程序要求,以在运行之前删除该目录:

 File RemoveModules
    {
      Ensure = 'absent'
      Type = 'Directory'
      Force = $true
      Recurse = $true
      DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules'
    }

不幸的是,这失败并出现以下错误:

关键属性组合'C:\\ users \\ Jason \\ Documents \\ WindowsPowerShell \\ Modules'与节点'Localhost'中资源'File'的键'DestinationPath'重复。 请确保关键属性对于节点中的每个资源都是唯一的。

无论如何,我想用文件资源来做,但显然,使用脚本提供程序或其他一些自定义资源很容易做到这一点。 在此先感谢您的帮助!

===============>>#1 票数:3 已采纳

我是DSC新手。 花了周日下午最好的部分来查看资源并试图弄清楚如何解决这个问题。 所以,我真诚地感谢你。 查看DSC很有趣。

我想,这可行:

Configuration TestRun
{
  Param 
    (
      $ComputerName = 'Localhost'
    )
    Node $ComputerName
    {
        Script RemoveModules { 
            GetScript = {#needs to return hashtable.}
            SetScript = { 
                $ump = "$HOME" + "\Documents\WindowsPowerShell\Modules\"
                Remove-Item -Path $ump -Recurse -Force
            }
            TestScript = { 
                $ump = "$HOME" + "\Documents\WindowsPowerShell\Modules\"
                $mp = "C:\git\Modules"
                if((Compare-Object $(gci $mp) $(gci $ump))){
                    $false #at least one difference exists, SetScript will be called.
                }else{
                    $true #nothing is different
                }

            }
        }
        File LoadModules
        {
            Ensure = 'Present'
            Type = 'Directory'
            Force = $true
            Recurse = $true
            SourcePath = "C:\git\Modules"
            DestinationPath = 'C:\users\Jason\Documents\WindowsPowerShell\Modules'
            DependsOn = "[Script]RemoveModules"
            Checksum = "SHA-256"
            MatchSource = $true
        }
    }
}

参考文献:

===============>>#2 票数:0

您可以先复制文件,然后删除不必要的文件:

Configuration DirectoryCopy
{
    param
    (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $SourcePath,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String] $DestinationPath
    )

    File CopyFiles
    {
        SourcePath      = $SourcePath
        DestinationPath = $DestinationPath
        Type            = 'Directory'
        Recurse         = $true
        Checksum        = 'SHA-256'  # Overwrite modified files
        Force           = $true
    }

    Script DeleteAdditionalDestinationFiles
    {
        TestScript =
        {
            $currentFiles = Get-ChildItem $using:DestinationPath -Recurse
            $desiredFiles = Get-ChildItem $using:SourcePath -Recurse

            $hasAdditionalFiles = [bool](Compare-Object -ReferenceObject $currentFiles -DifferenceObject $desiredFiles)

            return !$hasAdditionalFiles
        }
        SetScript =
        {
            $currentFiles = Get-ChildItem $using:DestinationPath -Recurse
            $desiredFiles = Get-ChildItem $using:SourcePath -Recurse

            $additionalFiles = Compare-Object -ReferenceObject $currentFiles -DifferenceObject $desiredFiles | Select-Object -ExpandProperty InputObject

            # First remove the directories and all its descendants.
            $additionalFiles | Where-Object { ($_.Attributes -band [IO.FileAttributes]::Directory) -eq [IO.FileAttributes]::Directory } | Remove-Item -Recurse -Verbose

            # Remove the remaining files that were not in any already removed directory.
            $additionalFiles | Where-Object { Test-Path -Path $_.FullName } | Remove-Item -Verbose
        }
        GetScript = {
            $currentFiles = Get-ChildItem $using:DestinationPath -Recurse

            return @{
                Result     = $currentFiles
                TestScript = $TestScript
                SetScript  = $SetScript
                GetScript  = $GetScript
            }
        }

        DependsOn = '[File]CopyFiles'
    }
}

这样,如果有任何目录树更改,则在复制所需文件之前不必删除所有文件。 只有必须添加,修改或删除的文件才会受到影响。

  ask by Jason Morgan translate from so

未解决问题?本站智能推荐:

2回复

我可以在DSC文件资源中使用动态变量吗?

如何在运行时获取所需状态配置的文件资源以确定其$ DestinationPath? 似乎仅在生成mof文件时才设置。 我的以下脚本显示了我要执行的操作。 我知道为什么它不起作用,我找不到如何使它起作用。 该脚本在目标计算机上查看PSModulePath变量,并从该变量中提取一条路
3回复

使用Powershell DSC安装可执行文件

我正在尝试使用PowerShell DSC安装Visual Studio 2013,但我遇到了一些问题,并希望你们能为我清理它。 DSC是否能够重新启动节点然后恢复VS的安装? 有谁知道这个错误意味着什么? “已安装vs_ultimate.exe,但指定的ProductId和/或名称与包详
1回复

Powershell DSC文件内容中的奇怪字符

我是PowerShell DSC的新手,正在编写一个脚本,该脚本应确保某个文件具有正确的内容。 这很简单: 当我在记事本中打开文件时,内容似乎还可以。 但是,当我执行它时,我收到一条错误消息: 突然文件中出现了这些奇怪的∩╗┐字符! 我认为这是某种编码问题,但是我不知道如何
2回复

使用Powershell DSC管理通用配置文件

我们正在为内部.NET应用程序开发基于Windows DSC的部署系统。 作为当前安装说明的一部分,有一个步骤可以编辑.NET machine.config文件。 (是的,我知道我们的应用程序要求这样做很糟糕,但目前无法解决)。 我想知道其他人如何使用DSC管理“通用”配置文件? 我
1回复

DSC文件资源 - 复制文件

我正在使用PowerShell DSC Pull Server。 每次修改时都可以使用File资源复制文件? 我试过以下: 但没有运气:如果我从SourcePath修改文件,我希望目标文件也应该更新。
1回复

如何使用DSC在Azure VM上安装存储在Azure文件共享中的exe文件?

我有一些.exe文件,我需要使用azure自动化powershell DSC在azure中的VM上安装。 这可能吗,怎么办? exe文件当前存储在azure文件共享中。
2回复

Azure自动化DSC-在DSC配置中使用PSCredential

我试图将凭据传递给旨在通过Azure自动化DSC进行部署的dsc配置,尽管我似乎无法使用两种记录的方法来使其正常工作。 1)第一种方法表示可以将PSCredential添加到与用于dsc的自动化帐户关联的凭据存储中。 我可以找到的所有文档都涉及到Azure经典门户,并指示您选择凭据“类型
2回复

如何从DSC脚本中的smb share获取一些文件?

我正在尝试在自定义dsc脚本中从共享复制一个文件。 下面的这段代码在Powershell中效果很好,但在dsc资源中却不起作用。 Powershell 4/5是否具有用于从smb共享获取文件的本机Commandlet? 还是任何变体?
1回复

DSC文件资源文件不复制PDB文件

我正在使用DSC文件资源更新具有最新版本的应用程序服务器。 除了.PDB文件之外,这很有用。 这些从未得到更新。 我只用一个文件重现了这种行为。 这是一个示例配置 } 运行上面的配置后,目录目标将反映目录源,但.pdb文件除外。 与PdbFile块中的单个文件一样,表现出
2回复

我可以将基于类的DSC资源存储在与PSM文件分开的文件中吗?

当前,对于我的模块,我将实际代码存储在与PSM1文件不同的文件中,然后对其进行点源处理,并使用Export-ModuleMember导出函数,这种方式使我可以轻松地调试/测试各个函数。 我认为这是不可能的,因为Export-ModuleMember没有提供导出DSCResource的选项,