PowerShell DSC 条件语句问题

问题描述 投票:0回答:1

使用 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)
          }
     } 
}
powershell dsc
1个回答
0
投票

((get-disk).OperationalStatus -ieq 'Offline')

  • 一般说明:如果只有 one 磁盘,此测试将返回

    $true
    $false

  • 具体问题是,该表达式不返回感兴趣的 disks,而是返回布尔值(见上文)或

    'Offline'
    值数组。

想必,您想要以下内容(免责声明:我对 DSC 不熟悉):

# ...
foreach ($disk in ((get-disk).Where({ $_.OperationalStatus -ieq 'Offline' }))
# ...
© www.soinside.com 2019 - 2024. All rights reserved.