Получение PhysicalDrive с использованием буквы диска? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь вызвать приложение командной строки, которому требуется доступ на уровне блоков к необработанному диску для работы (qemu), используя пакетный сценарий, чтобы помочь людям в полевых условиях проверить клонированные флэш-накопители без риска для их оборудования.

Я знаю, что могу использовать wmic diskdrive list brief, чтобы получить PhysicalDrive количество дисков, подключенных к системе, и я могу использовать "%CD:~0,2%", чтобы получить букву диска текущего диска. Я также знаю, что wmic logicaldisk list brief чтобы получить список дисков по буквам.

Два списка должны коррелировать, но я не могу гарантировать, что они это делают - и нет двух полей, которые кажутся постоянными в двух режимах вывода данных - есть ли хороший способ гарантировать передать правильный диск на qemu?

Для справки, результирующая команда qemu должна быть только такой:

qemu -hda \\.\PhysicalDrive# где "#" - номер диска, с которого выполняется сценарий.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Возможно, вы можете попробовать сопровождающий , который использует , например:

@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%.

0 голосов
/ 10 мая 2019

Вот пример скрипта 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...