尝试将驱动器号分配给分区时,Put()有时会抛出异常

时间:2015-01-09 23:19:12

标签: windows powershell wmi

我有一个简单的脚本,可以为任何未经编辑的分区分配驱动器号,如下所示:

function GetNextAvailableLetter
{
  #returns an unused char for drive letter assignment, or $null if none are available
}

foreach ($disk in ( get-wmiobject -class win32_volume | where-object { $_.DriveLetter -eq $null } ) )
{
  $letter = GetNextAvailableLetter
  if ( $letter -ne $null )
  {
    $disk.DriveLetter = $letter + ":"
    $disk.Put()
  }
}

奇怪的是,有时它会起作用,有时Put()会抛出异常:

Exception calling "Put" with "0" argument(s): "Not supported"

我不知道为什么Put()会抛出。

2 个答案:

答案 0 :(得分:1)

我在我的计算机上制作了几个空的无驱动驱动器,并且能够重新创建这个以及我认为你可能忽略的另一个错误。

Property 'DriveLetter' cannot be found on this object; make sure it exists and is settable.
At line:2 char:1
+ $disk.DriveLetter = "Q:"
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

Exception calling "Put" with "0" argument(s): "Access is denied.
"
At line:3 char:1
+ $disk.Put()
+ ~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

解决这个问题的方法是运行变量$disk但是对于每个循环或沿着这些行的某些东西。另一种方法是提前检查$disk.Count

$disk = get-wmiobject -class win32_volume | where-object { $_.DriveLetter -eq $null }
If (($disk) -and ($disk.Count -eq 1)){
    $disk.DriveLetter = "Q:"
    $disk.Put()
}

If理论上应该在$disk为空或者返回多个对象时保护您免受错误的影响。

答案 1 :(得分:1)

根据Scripting Guys

  

出现此错误的原因是Windows PowerShell提示符未以管理员权限运行。不幸的是,WMI回填的错误并没有告诉我们问题与权利有关。