我正在尝试使用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
}
}
答案 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方法实现它是一种很糟糕的方式 - 我应该构建一个正则表达式来捕获我发生的所有可能性(到目前为止,文件路径中的共享和冒号是$)