powershell和diskpart

powershell和diskpart,powershell,Powershell,简而言之,我有一个需要分配驱动器号的卷(使用diskpart)。现在的问题是,音量并没有保持不变。您输入磁盘a部分并执行“列出卷”,特定卷将是卷0,然后“退出”。再次输入并再次执行“列表卷”,这一次是第4卷。所以它继续着。 现在,如果这是由个人完成的,则不会成为问题,但这是一项自动任务,将“断开”windows 2003上的卷,并在其他服务器上使用,然后再次装载到windows 2003服务器上 我正在尝试在powershell中编写一个脚本,该脚本将能够根据几个唯一字段识别卷。问题在于我一直在

简而言之,我有一个需要分配驱动器号的卷(使用diskpart)。现在的问题是,音量并没有保持不变。您输入磁盘a部分并执行“列出卷”,特定卷将是卷0,然后“退出”。再次输入并再次执行“列表卷”,这一次是第4卷。所以它继续着。 现在,如果这是由个人完成的,则不会成为问题,但这是一项自动任务,将“断开”windows 2003上的卷,并在其他服务器上使用,然后再次装载到windows 2003服务器上

我正在尝试在powershell中编写一个脚本,该脚本将能够根据几个唯一字段识别卷。问题在于我一直在用powershell解释diskpart的“list volume”命令的输出

下面的命令提供了我需要处理的输出,但在我丢失后,输出仍然存在

cls
$dp = "list volume" | diskpart | ? { $_ -match "^  [^-]" }
$dp | format-table  -auto
这是它提供的输出,我要找的是第1卷

  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            

有谁能帮我找到正确的方向吗。我已束手无策。

您可以使用Powershell和WMI设置驱动器号。除非您正在做其他事情,否则不应该需要diskpart(我不熟悉该工具)

因此(假设您试图设置一个没有盘符的卷的驱动器盘符),这应该可以工作:

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

$drive.DriveLetter = "X:"

$drive.Put()
如果您对该驱动器不确定,只需首先查询它,并确保您只获得了所需的驱动器:

gwmi Win32_Volume | where {$_.DriveLetter -eq ""}
是的。这是diskpart的一个“功能”

MS的建议(在您的案例中不是很有用)

  • 保留磁盘管理控制台 (Diskmgmt.msc)在运行时 处理脚本。或者,举个例子 正在运行的Diskpart.exe实用程序的 在后台处理 脚本。执行此操作时,卷 数字不应随时间而变化 Diskpart.exe的实例 效用。使用卷标 信息而不是卷 用于跟踪特定卷的编号

    请参阅错误报告


  • 是的,我知道了

    答案是这样的
    使用VB脚本,我成功创建了一个符合我所需的脚本,然后我将其翻译为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
    }
    
    从一个帖子开始


    我希望这可能会帮助其他人

    谢谢大家的帮助

    您是否一直在寻找未分配驱动器号的卷?如果我对您要定位的卷的假设是错误的,请告诉我。同样的原则应该仍然有效,但只需要让WMI查询准确地查找您想要的内容。我假设PUT命令用于提交更改?问题是它给出了错误,我试图创建一个新对象和设置类型等,但它不会接受对Put方法的调用$PutOptions=New Object System.Management.PutOptions$PutOptions.Type=2$drive.Put($PutOptions)请告诉我我在哪里傻了。我能看看你的完整代码吗?您不需要使用任何put选项,只需向下查询该项,存储在变量中,对其进行更改,然后将其放置()下面是我尝试的两个选项以及每个选项的输出。我将分别发布每个(注释限制)选项1====script-----cls$drive=get wmiobject Win32|u Volume |其中{$..DeviceID-如“b0f012f6-82b1-11df-a41c-001f29e8f0be”}$drive.DriveLetter=“T:$drive.Put()输出------异常调用带有“0”参数的“Put”:“不受支持”在D:\transport\u actions\get\u vol\u id4.ps1:5 char:11+$drive.Put Option 2===script-----cls$drive=get wmiobject Win32\u Volume |其中{$\.DeviceID类似于“b0f012f6-82b1-11df-a41c-001f29e8f0be”}$drive.DriveLetter=“T:$PutOptions=New Object System.Management.PutOptions$PutOptions.Type=2$drive.Put($PutOptions)输出------调用带有“1”参数的“Put”时出现异常:在D:\transport\u actions\get\u vol\u id4.ps1:10 char:11+$drive.Put Belisaruis处出现“Unsupported parameter”,感谢您提供的信息。非常悲哀的是,不得不回到战术上,比如保持开放,试图保持vol no不变。在这种情况下,不可能保持打开状态。