使用驱动器号获取PhysicalDrive?

时间:2019-05-10 03:03:19

标签: batch-file

我正在尝试调用一个命令行应用程序,该应用程序需要使用批处理脚本来对原始磁盘进行块级访问才能运行(Load A <-- A in main memory Load B <-- B is in L2 Store C, 123 <-- C is L1 ),以帮助现场人员对克隆的闪存驱动器进行现场测试而不会对其设备造成风险

我知道我可以使用qemu获取连接到系统的wmic diskdrive list brief个磁盘,也可以使用PhysicalDrive获取当前驱动器的驱动器号。我也知道"%CD:~0,2%"是通过字母来获取驱动器列表的。

这两个列表应该相关联,但我不能保证它们相互关联-并且没有两个字段在两种数据输出模式下都具有持久性-是否有一个很好的方法来保证我将正确的驱动器传递给wmic logicaldisk list brief吗?

作为参考,产生的qemu命令只需要这样:

qemu,其中“#”是脚本从其执行的驱动器的驱动器号。

2 个答案:

答案 0 :(得分:0)

这是一个powershell脚本的示例..正如您所看到的,这不仅仅是编写两行代码的问题。

Function Main {
    $diskdrives = get-wmiobject Win32_DiskDrive | sort Index
    $colSize = @{Name='Size';Expression={Get-HRSize $_.Size}}
    foreach ( $disk in $diskdrives ) {
        $scsi_details = 'SCSI ' + $disk.SCSIBus         + ':' +
                                  $disk.SCSILogicalUnit + ':' +
                                  $disk.SCSIPort        + ':' +
                                  $disk.SCSITargetID
        write $( 'Disk ' + $disk.Index + ' - ' + $scsi_details +
                 ' - ' + ( Get-HRSize $disk.size) )
        $part_query = 'ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' +
                      $disk.DeviceID.replace('\','\\') +
                      '"} WHERE AssocClass=Win32_DiskDriveToDiskPartition'
        $partitions = @( get-wmiobject -query $part_query | 
                         sort StartingOffset )
        foreach ($partition in $partitions) {
            $vol_query = 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="' +
                         $partition.DeviceID +
                         '"} WHERE AssocClass=Win32_LogicalDiskToPartition'
            $volumes   = @(get-wmiobject -query $vol_query)
            write $( '    Partition ' + $partition.Index + '  ' +
                     ( Get-HRSize $partition.Size) + '  ' +
                     $partition.Type
                   )

            foreach ( $volume in $volumes) {
                write $( '        ' + $volume.name  +
                        ' [' + $volume.FileSystem + '] ' + 
                         ( Get-HRSize $volume.Size ) + ' ( ' +
                         ( Get-HRSize $volume.FreeSpace ) + ' free )'
                       )
            }
        }
        write ''
    }
}

function Get-HRSize {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True, ValueFromPipeline=$True)]
        [INT64] $bytes
    )
    process {
        if     ( $bytes -gt 1pb ) { "{0:N2} PB" -f ($bytes / 1pb) }
        elseif ( $bytes -gt 1tb ) { "{0:N2} TB" -f ($bytes / 1tb) }
        elseif ( $bytes -gt 1gb ) { "{0:N2} GB" -f ($bytes / 1gb) }
        elseif ( $bytes -gt 1mb ) { "{0:N2} MB" -f ($bytes / 1mb) }
        elseif ( $bytes -gt 1kb ) { "{0:N2} KB" -f ($bytes / 1kb) }
        else   { "{0:N} Bytes" -f $bytes }
    }
} 
Main

答案 1 :(得分:0)

也许您可以尝试使用随附的,它像这样使用

@For /F Tokens^=2Delims^=^" %%A In ('WMIC LogicalDisk Where "DeviceID='%~d0'" Assoc /AssocClass:Win32_LogicalDiskToPartition 2^>Nul^|Find "n."')Do @For /F Tokens^=2Delims^=^" %%B In ('WMIC Path Win32_DiskDriveToDiskPartition 2^>Nul^|Find "%%A"')Do @QEmu -hda %%B

这是同一行,但分成4行,为便于阅读,但无需调整即可运行

@For /F Tokens^=2Delims^=^" %%A In ('WMIC LogicalDisk Where "DeviceID='%~d0'"^
 Assoc /AssocClass:Win32_LogicalDiskToPartition 2^>Nul^|Find "n."'
)Do @For /F Tokens^=2Delims^=^" %%B In ('WMIC Path^
 Win32_DiskDriveToDiskPartition 2^>Nul^|Find "%%A"')Do @QEmu -hda %%B

以上代码示例使用%~d0作为保存正在运行的批处理文件的驱动器号。如果您希望将驱动器用于当前目录(因为它不一定相同),请将%~d0替换为%CD:~,2%