如何围绕文件资源创建PowerShell DSC foreach循环,以复制配置中定义的多个文件?

时间:2014-11-14 21:12:54

标签: powershell dsc

我正在尝试使用PowerShell DSC执行多个文件副本。我的配置有一个需要复制的源/目标文件列表。但是,文件资源需要具有唯一的名称,以便您可以对资源执行依赖。

我是PowerShell的新手,我正在尝试找出DSC脚本(.ps1)的正确格式,以允许围绕File资源进行foreach。目前,我的代码给了我一个“重复资源标识符”错误,因为看起来文件资源没有获得唯一的名称。

配置(psd1文件):

{
AllNodes = @(
@{
  NodeName = '*'
  BuildOutputRoot = 'C:\_BuildDrop\'
  FilesToCopy = @(
    @{
      SourcePath = 'C:\_BuildDrop\SampleConfig.xml'
      TargetPath = 'C:\SampleCode\SampleConfig.xml'
    },
    @{
      SourcePath = 'C:\_BuildDrop\SampleConfig2.xml'
      TargetPath = 'C:\SampleCode\SampleConfig2.xml'
    },

用于DSC(代码段)的Powershell ps1文件:

Configuration MachineToolsFilesAndDirectories
{
# Copy files on all machines
Node $AllNodes.NodeName
{
    foreach ($FileToCopy in $Node.FilesToCopy)
    {
        File $FileToCopy$Number
        {
            Ensure = "Present"
            Type = "File"
            Recurse = $false
            SourcePath = $FileToCopy.SourcePath
            DestinationPath = $FileToCopy.TargetPath
        }
    }

2 个答案:

答案 0 :(得分:5)

您似乎永远不会定义或更改$Number的值,因此每个File资源最终都会使用相同的名称。尝试这样的事情。

Configuration MachineToolsFilesAndDirectories
{
# Copy files on all machines
Node $AllNodes.NodeName
{
    $Number = 0
    foreach ($FileToCopy in $Node.FilesToCopy)
    {
        $Number += 1
        $thisFile = "$FileToCopy$Number"

        File $thisFile
        {
            Ensure = "Present"
            Type = "File"
            Recurse = $false
            SourcePath = $FileToCopy.SourcePath
            DestinationPath = $FileToCopy.TargetPath
        }
    }
}

答案 1 :(得分:1)

我不确定这是否是每个人都做的事情,但我总是在资源中的关键值之后命名我的资源,因此在MOF中,每个资源显然都以它的功能命名。唯一要记住的是,您必须清理资源名称,因为只允许使用字母数字和其他一些字符(特别是文件路径不是冒号)。

例如:

Dim rowOneOrderDate As Date = dt.Rows(0).Field(Of Date)("ORderDate")

这相当于:

File $FileToCopy.TargetPath.Replace(':','\')
{
    Ensure = "Present"
    Type = "File"
    Recurse = $false
    SourcePath = $FileToCopy.SourcePath
    DestinationPath = $FileToCopy.TargetPath
}

如果填写如下:

File 'C\\SampleCode\SampleConfig.xml'
{
    Ensure = "Present"
    Type = "File"
    Recurse = $false
    SourcePath = 'C:\_BuildDrop\SampleConfig.xml'
    DestinationPath = 'C:\SampleCode\SampleConfig.xml'
}

我意识到使用.Replace方法实现它是一种很糟糕的方式 - 我应该构建一个正则表达式来捕获我发生的所有可能性(到目前为止,文件路径中的共享和冒号是$)