7

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

我是 PowerShell 的新手,我正在尝试找出 DSC 脚本 (.ps1) 的正确格式,以允许围绕文件资源进行 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
        }
    }
4

2 回答 2

6

看起来您从未定义或更改 的值,$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
        }
    }
}
于 2014-11-14T21:17:31.910 回答
1

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

例如:

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'
}

如果它是从以下内容填充的:

@{
  SourcePath = 'C:\_BuildDrop\SampleConfig.xml'
  TargetPath = 'C:\SampleCode\SampleConfig.xml'
}

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

于 2016-01-10T15:21:49.650 回答