silent001 Posted November 26, 2015 Posted November 26, 2015 Good dayI have googled and googled but cant seam to get a working answer.I want to have a cmd batch file get the current drive letter then using the drive letter get the disk number eg@echo offpushd "%~dp0"echo %~d0set _DiskNum = wmic diskdrive %~d0 get disknumber #I know this isn't a real commandgrubinst.exe --verbose -t=0 --silent-boot --skip-mbr-test(%_DiskNum%) #This command I will stillpause #work out once the above exit #command is working.Thank you in advance
Glenn9999 Posted November 26, 2015 Posted November 26, 2015 This is not going to be an incredibly easy task. In fact, you may have to go VBS or program for it. Basically for WMI, you would have to hit Win32_LogicalDisk and then link it to Win32_DiskPartition in order to see what you're getting. Or if you have string testing capability, just checking Win32_LogicalDiskToPartition would cut it if you can get the data out. Microsoft provides an example here. As for API, you'd have to call DeviceIoControl using IOCTL_STORAGE_GET_DEVICE_NUMBER But it seems there's no "one shot" answer to this.
silent001 Posted November 26, 2015 Author Posted November 26, 2015 (edited) Okay here is what I have its almost doneComputerName = "."dim strDriveNumset objFSO = CreateObject("Scripting.FileSystemObject")Set objShell = CreateObject("Wscript.Shell")Dim oDicSet oDic = CreateObject("scripting.dictionary")Set wmiServices = GetObject ( _ "winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)' Get physical disk driveSet wmiDiskDrives = wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")strPath = objShell.CurrentDirectorystrDrive = objFSO.GetDriveName(strPath)For Each wmiDiskDrive In wmiDiskDrives 'Use the disk drive device id to ' find associated partition query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _ & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition" Set wmiDiskPartitions = wmiServices.ExecQuery(query) For Each wmiDiskPartition In wmiDiskPartitions 'Use partition device id to find logical disk Set wmiLogicalDisks = wmiServices.ExecQuery _ ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _ & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition") For Each wmiLogicalDisk In wmiLogicalDisks if wmiLogicalDisk.DeviceID = strDrive then strDriveNum = wmiDiskDrive.DeviceID end if Next NextNextdrv0 = "\\.\PHYSICALDRIVE0"drv1 = "\\.\PHYSICALDRIVE1"drv2 = "\\.\PHYSICALDRIVE2"drv3 = "\\.\PHYSICALDRIVE3"drv4 = "\\.\PHYSICALDRIVE4"drv5 = "\\.\PHYSICALDRIVE5"drv6 = "\\.\PHYSICALDRIVE6"drv7 = "\\.\PHYSICALDRIVE7"drv8 = "\\.\PHYSICALDRIVE8"drv9 = "\\.\PHYSICALDRIVE9"if strDriveNum = drv0 thenstrDrv = "(hd0)"end ifif strDriveNum = drv1 thenstrDrv = "(hd1)"end ifif strDriveNum = drv2 thenstrDrv = "(hd2)"end ifif strDriveNum = drv3 thenstrDrv = "(hd3)"end ifif strDriveNum = drv4 thenstrDrv = "(hd4)"end ifif strDriveNum = drv5 thenstrDrv = "(hd5)"end ifif strDriveNum = drv6 thenstrDrv = "(hd6)"end ifif strDriveNum = drv7 thenstrDrv = "(hd7)"end ifif strDriveNum = drv8 thenstrDrv = "(hd8)"end ifif strDriveNum = drv9 thenstrDrv = "(hd9)"end ifstrRun = Chr(34) & strDrive & "\grubinst.exe" & Chr(34) & " --verbose -t=0 --silent-boot --skip-mbr-test" & strDrvwscript.echo strRunobjShell.Run strRun, 9Can someone maybe help with tidying up? Edited November 26, 2015 by silent001
Glenn9999 Posted November 26, 2015 Posted November 26, 2015 I can't help much on the VBS side, but I notice since I tried this as a program that it requires admin rights to get the file handle to call DeviceIOControl. So it may require you to elevate the script too to work.
Glenn9999 Posted November 26, 2015 Posted November 26, 2015 (edited) While I'm sure there's a good VBS solution to this, I thought I'd go ahead and post the program since I attempted it. (past all the UAC elevation stuff I had to put in the BAT) rem ----D:rem grubinst.exe --verbose -t=0 --silent-boot --skip-mbr-test(0) Seems to be catching the general idea. Though my batch skills aren't the best these days. @echo offpushd "%~dp0"echo %~d0disknumber %~d0 > temp.txtset /p _DiskNum=<temp.txtdel temp.txt@echo onrem grubinst.exe --verbose -t=0 --silent-boot --skip-mbr-test(%_DiskNum%) pause But I would say it's certainly a sub-optimal solution, especially if you can get the VBS to go fully. In fact, i'd go ahead and program the call to grubinst.exe within the program or whatever it is I'm wanting to do with the data. (File Pulled) Edited June 9, 2016 by Glenn9999 1
silent001 Posted November 26, 2015 Author Posted November 26, 2015 This is my final script and workingComputerName = "."dim strDriveNumset objFSO = CreateObject("Scripting.FileSystemObject")Set objShell = CreateObject("Wscript.Shell")Dim oDicSet oDic = CreateObject("scripting.dictionary")Set wmiServices = GetObject ( _ "winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)' Get physical disk driveSet wmiDiskDrives = wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")strPath = objShell.CurrentDirectorystrDrive = objFSO.GetDriveName(strPath)For Each wmiDiskDrive In wmiDiskDrives 'Use the disk drive device id to ' find associated partition query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _ & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition" Set wmiDiskPartitions = wmiServices.ExecQuery(query) For Each wmiDiskPartition In wmiDiskPartitions 'Use partition device id to find logical disk Set wmiLogicalDisks = wmiServices.ExecQuery _ ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _ & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition") For Each wmiLogicalDisk In wmiLogicalDisks if wmiLogicalDisk.DeviceID = strDrive then strDriveNum = wmiDiskDrive.DeviceID end if Next NextNextdrv0 = "\\.\PHYSICALDRIVE0"drv1 = "\\.\PHYSICALDRIVE1"drv2 = "\\.\PHYSICALDRIVE2"drv3 = "\\.\PHYSICALDRIVE3"drv4 = "\\.\PHYSICALDRIVE4"drv5 = "\\.\PHYSICALDRIVE5"drv6 = "\\.\PHYSICALDRIVE6"drv7 = "\\.\PHYSICALDRIVE7"drv8 = "\\.\PHYSICALDRIVE8"drv9 = "\\.\PHYSICALDRIVE9"if strDriveNum = drv0 thenstrDrv = "(hd0)"end ifif strDriveNum = drv1 thenstrDrv = "(hd1)"end ifif strDriveNum = drv2 thenstrDrv = "(hd2)"end ifif strDriveNum = drv3 thenstrDrv = "(hd3)"end ifif strDriveNum = drv4 thenstrDrv = "(hd4)"end ifif strDriveNum = drv5 thenstrDrv = "(hd5)"end ifif strDriveNum = drv6 thenstrDrv = "(hd6)"end ifif strDriveNum = drv7 thenstrDrv = "(hd7)"end ifif strDriveNum = drv8 thenstrDrv = "(hd8)"end ifif strDriveNum = drv9 thenstrDrv = "(hd9)"end ifstrRunPath = "grubinst"strRun = "grubinst.exe --verbose -t=0 --silent-boot --skip-mbr-test " & strDrvstrCommand = "cmd /K @echo off & CD " & strDrive & " & cd " & strRunPath & " & " & strRun & " & pause & exit"wscript.echo strCommandobjShell.run strCommand'Set oShell = Nothing Glenn9999 your batch files don't work it says disknumber is not a valid command
Glenn9999 Posted November 26, 2015 Posted November 26, 2015 >Glenn9999 your batch files don't work it says disknumber is not a valid command Did you read what I wrote? "While I'm sure there's a good VBS solution to this, I thought I'd go ahead and post the program since I attempted it. Looking at attachment: Download count...0.
gunsmokingman Posted November 27, 2015 Posted November 27, 2015 Here is a new WMI Query that I hope is more to what you need. '-> WMI ObjectDim Wmi :Set Wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")'-> Run Time VariblesDim Obj, Rpt'-> Wmi Query And Class Loop For Each Obj in Wmi.ExecQuery("SELECT * FROM Win32_DiskDrive")'-> Collect The Objects For The Wmi report Rpt = Rpt & "-----------------------------------" & vbCrLf & _ "Interface" &vbtab& Obj.InterfaceType & vbCrLf & _ "Model " &vbtab& Obj.Model & vbCrLf & _ "Name " & vbtab& Obj.Name & vbCrLf Next'-> Report The WMI Query MsgBox Space(10) & "WMI Disk Drive Report" & vbCrLf & Rpt,4120,"Result WMI"
DosProbie Posted November 27, 2015 Posted November 27, 2015 Silent I may be a little late for the party, but here is a snippet of a audit batch code that can be runas non-admin for basic hard drive information. Happy Thanksgiving!~DP @Echo Off SetLocal :: SYSTEM INFORMATION FOR LOCAL PRIMARY HARD DRIVE :: :: ### HD MODEL: For /F "Tokens=2 Delims==\" %%A In ('WMIc DiskDrive Get Model /Value') Do Set HDModel=%%A :: ### HD SERIAL NUMBER: For /F "Tokens=2 Delims==\" %%A In ('WMIc DiskDrive Get Serialnumber /Value') Do Set HDSerial=%%A :: ### HD FREE SPACE: For /F "UseBackQ Tokens=1-2 Delims==" %%A In (`WMIc LogicalDisk Where^ "DeviceID = '%CD:~,2%'" Get FreeSpace^, Size /Value`) Do If "%%B" NEq "" ( Call Set _%%A=%%B) Rem Set/a _FreePercent=%_FreeSpace:~,-3% / %_Size:~,-5% Set/a _FreePercent=%_FreeSpace:~,-6% / %_Size:~,-8% If %_FreeSpace:~,-6% lss 214748 (Set/a _FreeSpace=%_FreeSpace:~,-6%*9313/10000 ) Else (Set/a _FreeSpace=%_FreeSpace:~,-6%/1074*1000) :: ### OUTPUT: Echo. Hard Drive Model: %HDModel% Echo. HD Serial Number: %HDSerial% Echo. HD Free Space: Local Drive %CD:~,2% %_FreeSpace:~,-3% GB = %_FreePercent%%%^ Available Endlocal Pause>Nul
jaclaz Posted November 28, 2015 Posted November 28, 2015 The topic (or something very close to it) has been discussed extensively here:http://reboot.pro/topic/20240-how-to-get-partitions-path-in-command-prompt/http://reboot.pro/topic/20476-retrieving-devicedrive-information/Maybe you can find something of interest in the above, but more specifically if I get it right your question revolves around "On which \\.\PhysicalDrive# is the current partition/volume residing?"IF this is the case, I believe this would do nicely:@echo offecho This cmd has been run from LogicalDrive %~d0\FOR /F "tokens=2 delims=#," %%? IN ('WMIC Path Win32_LogicalDiskToPartition Get Antecedent^, Dependent ^|FIND "%~d0"') DO (echo LogicalDrive %~d0\ is residing on \\.\Physicaldrive%%?)pause(slightly longer than a one-liner in batch)jaclaz
dencorso Posted November 28, 2015 Posted November 28, 2015 Something is not right... sorry! Here's what i get (after pressing the <SpaceBar>, of course!): N:\>logphysThis cmd has been run from LogicalDrive N:\Press any key to continue . . .N:\>
jaclaz Posted November 29, 2015 Posted November 29, 2015 Try some plain commands:WMIC Path Win32_LogicalDiskToPartition Get Antecedent, DependentOr a:WMIC Path Win32_LogicalDiskToPartition Get Antecedent, Dependent /Format:tableOr a:WMIC Path Win32_LogicalDiskToPartition Get Antecedent, Dependent /Format:csvMaybe you have not the "default" output of the WMIC command? jaclaz
dencorso Posted November 29, 2015 Posted November 29, 2015 All 3 work OK ... see, for instance:N:\>WMIC Path Win32_LogicalDiskToPartition Get Antecedent, DependentAntecedent Dependent\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="C:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="D:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="E:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #2, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="F:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="G:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="H:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #2, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="I:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #3, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="J:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #3, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="K:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #2" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="L:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #8, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="T:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #8, Partition #1" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="V:"\\MACHINE-NAME\root\cimv2:Win32_DiskPartition.DeviceID="Disk #5, Partition #0" \\MACHINE-NAME\root\cimv2:Win32_LogicalDisk.DeviceID="Y:"
jaclaz Posted November 30, 2015 Posted November 30, 2015 All 3 work OK ... see, for instance: They may work fine , but the drive letter N: is nowhere to be seen in the output, which should mean that it is not a partition that is mounted to drive letter N: . jaclaz
dencorso Posted November 30, 2015 Posted November 30, 2015 All 3 work OK ... see, for instance:They may work fine , but the drive letter N: is nowhere to be seen in the output, which should mean that it is not a partition that is mounted to drive letter N: . Of course! N: is a 12.5 GB Gavotte Ramdisk !!!
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now