使用 PowerShell DSC 并遇到配置文件中的条件语句问题。代码如下。我收到以下错误:
VERBOSE: [AT20BLDTESTDB01]: LCM: [ Start Resource ] [[Disk]diskAdd_T]
VERBOSE: [AT20BLDTESTDB01]: LCM: [ Start Test ] [[Disk]diskAdd_T]
VERBOSE: [AT20BLDTESTDB01]: LCM: [ End Test ] [[Disk]diskAdd_T] in 0.0470 seconds.
PowerShell DSC resource DSC_Disk failed to execute Test-TargetResource functionality with error message: Cannot bind argument to parameter 'DiskId' because it is an empty string.
+ CategoryInfo : InvalidOperation: (:) [], CimException
+ FullyQualifiedErrorId : ProviderOperationExecutionFailure
+ PSComputerName : AT20BLDTESTDB01
我收到的错误是 $Disk.UniqueID 为空。然而,当我直接在机器上运行查询时,我得到了 4 个返回结果。所以,我不确定发生了什么事,能否提供一些帮助来解决这个问题。
Configuration InstallSQLServer {
param (
[Parameter(Mandatory)]
[string[]]$TargetServer
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
Import-DscResource -ModuleName StorageDsc
$SQLDriveLetters = @{}
$SQLDriveLetters.Add('E','SQL DATA')
$SQLDriveLetters.Add('L','SQL LOGS')
$SQLDriveLetters.Add('T','SQL TEMPDB')
$SQLDriveLetters.Add('S','SQL SYSTEM')
node $AllNodes.NodeName {
foreach ($disk in ((get-disk).OperationalStatus -ieq 'Offline'))
{
if ($SQLDriveLetters.Contains('E')) {$DriveLetter = 'E'}
if ($SQLDriveLetters.Contains('L')) {$DriveLetter = 'L'}
if ($SQLDriveLetters.Contains('S')) {$DriveLetter = 'S'}
if ($SQLDriveLetters.Contains('T')) {$DriveLetter = 'T'}
$DiskID = $disk.UniqueId
disk "diskAdd_$DriveLetter"
{
DiskIDType = "UniqueID"
DiskId = "$DiskID" #"$($Disk.UniqueId)"
DriveLetter = "$DriveLetter"
FSFormat = 'NTFS'
AllocationUnitSize = 64KB
FSLabel = $SQLDriveLetters[$DriveLetter]
}
$SQLDriveLetters.Remove($DriveLetter)
}
}
}
((get-disk).OperationalStatus -ieq 'Offline')
一般说明:如果只有 one 磁盘,此测试将返回
$true
或 $false
具体问题是,该表达式不返回感兴趣的 disks,而是返回布尔值(见上文)或
'Offline'
值数组。
想必,您想要以下内容(免责声明:我对 DSC 不熟悉):
# ...
foreach ($disk in ((get-disk).Where({ $_.OperationalStatus -ieq 'Offline' }))
# ...