Search code examples
vbscripthp-uft

Return volume name in Do loop


I'm trying to create a script for HP UFT to automatically create/mount/unmount VHDs as needed. The problem is that diskpart takes quite a while to create, mount, format and label the VHD. I need a method to pause the script while the VHD is being created/mounted, after which it will continue on with the script.

The variable uftDrive is currently returning a drive letter, not a volume name, so the loop just runs indefinitely. Any thoughts as to how to pass the volume names as a variable? The VHD script is automatically assigning the first-available drive letter to the drive, as we have multiple machines that UFT will be run on, and they don't have identical network drive mappings, forcing us to dynamically detect the drive by volume name.

'===========================================================================
'This will check to see if the Virtual Hard Disk (VHD) exists, and if not,
'create it
'===========================================================================
Dim makevhdExists, vhdExists
Set makevhdExists = CreateObject("Scripting.FileSystemObject")
Set vhdExists = CreateObject("Scripting.FileSystemObject")
If Not makevhdExists.FileExists("c:\UFT\mountVHD.bat") Then
    makevhdExists.CopyFile "\\companyADfolders\Users\UFT\VHD\*.*", "c:\UFT\"
End If
If Not makevhdExists.FileExists("c:\UFT\unmountVHD.bat") Then
    wait 2
    ElseIf Not vhdExists.FileExists("C:\UFT\UFT.vhd") Then
    SystemUtil.Run "cmd","/c""C:\UFT\createVHD.bat"""
End If

Dim uftExists, uftDrive
uftExists = "False"
Do
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery _
        ("Select * From Win32_LogicalDisk Where VolumeName = 'UFT'")
    For Each objItem in colItems
        uftDrive = objItem.Name 'This is currently returning a drive letter,
                                'not a volume name
        If uftDrive.Name = "UFT" Then 
            uftExists = "True"**
        End If
    Next
Loop Until uftExists = "True"

Solution

  • For the wait part

    WScript.Sleep 5000
    

    where the value indicated is milliseconds

    For the second part, maybe i'm missing something, so, instead of an answer I have one silly question:

    If you query wmi for win32_logicaldisk instances where their VolumeName is UFT, WHY your if command checks the Name property instead of the VolumeName property?

    In any case, you don't need that if. If colItems.Count is greater than 0, there is at least one instance that matches the indicated condition

    Something like this should work

    Dim uftExists
    uftExists = False
    
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    
    Do
        Set colItems = objWMIService.ExecQuery _
            ("Select * From Win32_LogicalDisk Where VolumeName = 'UFT'")
        If colItems.Count > 0 Then 
            utfExists = True
        Else 
            Sleep 500
        End If
    Loop Until uftExists