PowerShell和DiskPart

4
简而言之,我需要为一个卷分配驱动器号(使用diskpart)。问题在于该卷不是固定的。你输入diskpart并执行“list volume”命令时,特定的卷可能是卷0,然后退出。再次进入并再次执行“list volume”命令,这次它可能是卷4。如此循环下去。 如果这是由人手动完成,那就不是问题,但这是一个自动化任务,在Windows 2003上“断开”该卷,并在其他服务器上使用后再次挂载到Windows 2003服务器上。
我正在尝试编写一个PowerShell脚本,根据一些唯一的字段来识别该卷。问题在于我在使用PowerShell解释diskpart的“list volume”命令的输出时遇到了困难。
以下命令提供了我需要处理的输出,但之后我就不知所措了。
cls
$dp = "list volume" | diskpart | ? { $_ -match "^  [^-]" }
$dp | format-table  -auto

这是它提供的输出,我需要的音量是第一卷。

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  Volume 0     F                       DVD-ROM         0 B  Healthy            
  *Volume 1                             Partition    100 GB  Healthy*            
  Volume 2     E   DATA         NTFS   Partition    547 GB  Healthy            
  Volume 3     C   OS           NTFS   Partition     39 GB  Healthy    System  
  Volume 4     D   APPS         NTFS   Partition     98 GB  Healthy            

请问有人能帮我找到正确的方向吗?我已经快要崩溃了。

这段内容与IT技术无关。

你是否总是在寻找没有分配驱动器号的卷? - Taylor Bird
3个回答

6

我明白了!

这里是答案。
使用VB Script,我成功创建了一个脚本来完成我想要的操作,然后我将其转换为Powershell,并在下面提供了脚本。

$drive = gwmi Win32_Volume | where {$_.DeviceID -like "*b0f012f6-82b1-11df-a41c-001f29e8f0be*"}
$drive.AddMountPoint("T:\")
$drive.DriveLetter = "T:"
$drive.Put_
$drive.Mount()

我运行了以下脚本获取的设备ID:
# get volumes on this system
$volumes = get-wmiobject Win32_Volume
# display volume info
# There are {0} volumes on this system, as follows: " -f ($volumes.length)
# Iterate through volumes and display information
foreach ($vol in $volumes) {
    "Volume: {0}" -f ++$i
    "============================="
    $vol | Format-List Access,Automount,Availability,BlockSize,BootVolume,Capacity,Caption,Compressed,ConfigManagerErrorCode,ConfigManagerUserConfig,CreationClassName,Description,DeviceID,DirtyBitSet,DriveLetter,DriveType,ErrorCleared,ErrorDescription,ErrorMethodology,FileSystem,FreeSpace,IndexingEnabled,InstallDate,Label,LastErrorCode,MaximumFileNameLength,Name,NumberOfBlocks,PageFilePresent,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,Purpose,QuotasEnabled,QuotasIncomplete,QuotasRebuilding,SerialNumber,Status,StatusInfo,SupportsDiskQuotas,SupportsFileBasedCompression,SystemCreationClassName,SystemName,SystemVolume
}

以下是从msdn关于Win32_Volume类的文章中摘录的内容。

希望这能对其他人有所帮助。

感谢所有提供帮助的人!


也可以使用CMD命令mountvol T: "\\?\Volume{b0f012f6-82b1-11df-a41c-001f29e8f0be}\"来执行此操作,然后使用mountvol T: /d取消指定。 - AgentRev

2
您可以使用Powershell和WMI来设置驱动器号。除非您正在执行其他操作(我不熟悉该工具),否则不需要使用diskpart。

因此(假设您要设置没有驱动器号的卷的驱动器号),则应该可以使用以下命令:

$drive = gwmi Win32_Volume | where {$_.DriveLetter -eq ""}

$drive.DriveLetter = "X:"

$drive.Put()

如果您不确定驱动器,请先查询一下,确保只获取想要的那个:

gwmi Win32_Volume | where {$_.DriveLetter -eq ""}

好的,我已经成功使用设备ID和LIKE操作来调整音量。我猜PUT命令是提交更改的命令?问题在于出现了错误。我尝试创建一个新对象并设置类型等,但它无法接受Put方法的调用。 $PutOptions = New-Object System.Management.PutOptions $PutOptions.Type = 2 $drive.Put($PutOptions)请告诉我我错在哪里了。 - Maartin
我能看一下你的全部代码吗?你不需要使用任何put选项,只需查询到该项,存储在变量中,更改它,然后调用put()函数即可。 - Taylor Bird
以下是我尝试的两个选项及其输出。 我将分别发布它们(评论限制)

选项1

脚本

cls $drive = get-wmiobject Win32_Volume | where {$_.DeviceID -like "b0f012f6-82b1-11df-a41c-001f29e8f0be"} $drive.DriveLetter = "T:"$drive.Put()

输出

使用“0”个参数调用“Put”时出错:“不支持” 位于 D:\transport_actions\get_vol_id4.ps1 的第 5 行字符 11
  • $drive.Put <<<< ()
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : DotNetMethodException
- Maartin

脚本

cls $drive = get-wmiobject Win32_Volume | where {$_.DeviceID -like "b0f012f6-82b1-11df-a41c-001f29e8f0be"} $drive.DriveLetter = "T:"$PutOptions = New-Object System.Management.PutOptions $PutOptions.Type = 2$drive.Put($PutOptions)

输出

调用带有“1”个参数的“Put”时出错:“不支持的参数” 位于 D:\transport_actions\get_vol_id4.ps1 的第 10 行字符 11
  • $drive.Put <<<< ($PutOptions)
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : DotNetMethodException
- Maartin
泰勒,你有什么建议吗?我还没有找到任何关于这个问题的线索。 - Maartin
显示剩余3条评论

1

是的,这是diskpart的“特性”。

微软的建议(在您的情况下可能不太有用)

  • 在处理脚本时保持磁盘管理控制台(Diskmgmt.msc)运行。或者,在后台保持一个Diskpart.exe实例运行。这样做时,卷号应该不会在Diskpart.exe实例之间更改。使用卷标信息而不是卷号来跟踪特定的卷。

    请参见错误报告here


Belisaruis,感谢您提供的信息。很遗憾不得不采取保持开放状态以尝试保持音量不变等策略。 在这种情况下,无法保持其开放状态。 - Maartin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接