我有一个简单的脚本,可以为任何未经编辑的分区分配驱动器号,如下所示:
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()
会抛出。
答案 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)
出现此错误的原因是Windows PowerShell提示符未以管理员权限运行。不幸的是,WMI回填的错误并没有告诉我们问题与权利有关。