Decrypt my World

Cryptography, Security, Debugging and more!

How to automate a command line utility like DiskPart (vbscript)

How to automate a command line utility like DiskPart (vbscript)

  • Comments 2

Hi all,

The other day I created a VBScript to automate DiskPart.exe tool and be able to perform tasks on a disk after selecting it by LUN ID. Note that Diskpart only allow us to select disks by their index number or their location path.

Bellow you can see a sample Diskpart.exe script, and how I managed to do the same stuff with VBScript after finding the right disk by its LUN ID. In general, this sample will show you how automate any other command line tool by sending commands to it and reading and parsing its output:

 

' ===================================================================
' Sample diskpart script:
'
' rescan
' sel disk 37
' sel vol 0
' assign letter f
' exit
'

' ===================================================================
' PARAMETERS
' ===================================================================
' Get LUN ID and letter to assign from user.
If Wscript.Arguments.Count <> 2 Then
' If we didn't pass them as params to the script, ask the user
' for them
iLunId = CInt(InputBox("Enter LUN ID"))
cLetter = InputBox("Enter letter")
Else
iLunId = CInt(Wscript.Arguments(0))
cLetter = Wscript.Arguments(1)
End If

' ===================================================================
' MAIN
' ===================================================================

' Run diskpart
set objShell = WScript.CreateObject("WScript.Shell")
set objExec = objShell.Exec("diskpart.exe")

' Let's find the disk which LUN ID we need

' Rescan the disks
strOutput = ExecuteDiskPartCommand("rescan")
WScript.echo strOutput

' Select the first disk
strOutput = ExecuteDiskPartCommand("sel disk 0")
WScript.echo strOutput

' Iterate through the disks until we find the one we need
bFoundDisk = false
Do While InStr(strOutput, "There is no disk selected") = 0

' See current disk details
strOutput = ExecuteDiskPartCommand("detail disk")
WScript.echo strOutput

' Is this the disk which LUN ID is the one we are looking for?
If (GetLunId(strOutput) = iLunId) Then
' Yes. Launch the rest of the commands on the original diskpart script
strOutput = ExecuteDiskPartCommand("sel vol 0")
WScript.echo strOutput

strOutput = ExecuteDiskPartCommand("assign letter " & cLetter)
WScript.echo strOutput

' We are done. We can leave now
bFoundDisk = true
Exit Do
End If

' We didn't find the disk. Move to the next one
strOutput = ExecuteDiskPartCommand("sel disk next")
WScript.echo strOutput
Loop

' We can close diskpart already
ExitDiskPart

WScript.echo "***********************************************************************"
WScript.echo "Script has finished. DiskPart has been closed"
If bFoundDisk Then
WScript.echo "RESULT: We successfully run desired commands on disk with LUN ID = " & iLunId
Else
WScript.echo "RESULT: We COULD NOT find the disk with LUN ID = " & iLunId
End If
WScript.echo "***********************************************************************"


' ===================================================================
' HELPER FUNCTIONS
' ===================================================================

Function ExecuteDiskPartCommand (strCommand)

' Run the command we want
objExec.StdIn.Write strCommand & VbCrLf

' If we read the output now, we will get the one from previous command (?). As we will always
' run a dummy command after every valid command, we can safely ignore this
Do While True
IgnoreThis = objExec.StdOut.ReadLine & vbcrlf

' Command finishes when diskpart prompt is shown again
If InStr(IgnoreThis, "DISKPART>") <> 0 Then Exit Do
Loop

' Run a dummy command, so the next time we call this function and try to read output,
' we can safely ignore the result
objExec.StdIn.Write VbCrLf

' Read command's output
ExecuteDiskPartCommand = ""
Do While True
ExecuteDiskPartCommand = ExecuteDiskPartCommand & objExec.StdOut.ReadLine & vbcrlf

' Command finishes when diskpart prompt is shown again
If InStr(ExecuteDiskPartCommand, "DISKPART>") <> 0 Then Exit Do
Loop

End Function

Function GetLunId(strDetails)
' Parse the details of the disk
arrayLines = Split(strDetails, vbcrlf)
for i = LBound(arrayLines) to UBound(arrayLines)
If (InStr(arrayLines(i), "LUN ID : ") <> 0) Then

' We found the LUN ID. Return it
GetLunId = CInt(Mid(arrayLines(i), Len("LUN ID : ")))
Exit For
End If
next
End Function

Sub ExitDiskPart
' Run exit command to exit the tool
objExec.StdIn.Write "exit" & VbCrLf
End Sub


I hope this helps.

Regards,

 

Alex (Alejandro Campos Magencio)

  • What are the odds that you can modify it to search for "Type   : USB".  I am trying to get it to recognize a USB Removable Drive.  Guess I am doing it wrong  :(

    Great post!

    David

  • It's Great!

    very helpful

    Thanks.

                   lihlcnkr

Page 1 of 1 (2 items)
Leave a Comment
  • Please add 2 and 3 and type the answer here:
  • Post
Translate This Page