PowerShell — как вы представляете единицу размера как переменную

Я хочу установить переменную для размеров единиц, таких как ГБ или ТБ, которые будут использоваться при расчете емкости диска. Это мой рабочий пример:

$SourceDriveLetter = "C"
$SourceDrive = Get-Volume -DriveLetter $SourceDriveLetter
$SourceCapacity = [math]::Round(($SourceDrive.Size/1TB),2)
$SourceCapacity
0.42

Я хочу установить что-то подобное, чтобы я мог легко перейти с ТБ на ГБ. Я использую $Unit в другом месте в отчете по электронной почте.

$SourceDriveLetter = "C"
$Unit = "TB"
$UnitCalc = 1 * [int]$Unit
$SourceDrive = Get-Volume -DriveLetter $SourceDriveLetter
$SourceCapacity = [math]::Round(($SourceDrive.Size/$UnitCalc),2)
$SourceCapacity

Я знаю, что $Unit — это строка для начала, но я не совсем уверен, как представить ее как литерал с математическим расчетом в $UnitCalc. Любая помощь будет принята с благодарностью.


person TechFA    schedule 28.02.2021    source источник
comment
Терабайт (ТБ или, точнее, ТиБ) равен 1024×1024×1024 байта = 1073741824 байта = 2³⁰ байта. Просто разделите на это число.   -  person Martin Liversage    schedule 28.02.2021
comment
Я хочу изменить $Unit = TB на $Unit = GB и обновить его везде в скрипте для расчетов и оставить в виде строки для вывода в отчете по электронной почте. Сервер может иметь большие диски, требующие ТБ, другие имеют меньшие и требуют представления ГБ. Хотелось бы просто изменить его в одном месте, а не в десяти местах по всему сценарию.   -  person TechFA    schedule 28.02.2021
comment
Если вы хотите, чтобы это было полностью автоматизировано: Как преобразовать значение в КБ, МБ или ГБ в зависимости от заполнителей цифр?   -  person iRon    schedule 28.02.2021
comment
$unit = 1mb; 200gb/$unit выход 204800   -  person Daniel    schedule 28.02.2021


Ответы (3)


PowerShell уже распознает такие сокращения, как 1GB, 1TB. Если у вас есть дисциплина исключать кавычки и включать 1, тогда ваш код уже работает.

$SourceDriveLetter = "C"
$Unit = 1TB
$SourceDrive = Get-Volume -DriveLetter $SourceDriveLetter
$SourceCapacity = [math]::Round(($SourceDrive.Size/$Unit),2)
$SourceCapacity

PS > .\Stack Overflow Demo.ps1
0.91

PS > $SourceDrive.Size / 1GB
930.528869628906
person Community    schedule 01.03.2021
comment
Бах, эти чертовы цитаты снова меня зацепили, я мог бы поклясться, что пробовал это. Благодарю вас! - person TechFA; 01.03.2021
comment
Это может испортить отчет по электронной почте, упомянутый в вопросе, если OP использует значение ```$Unit```` в качестве строки единиц - например. «Емкость диска $SourceCapacity $Unit» вдруг будет выглядеть очень странно :-). - person mclayton; 01.03.2021
comment
@mclayton Это правда, я думаю, это был скорее вопрос о том, как заставить его правильно работать с сокращением в переменной. В итоге я упростил ситуацию с помощью метода, упомянутого iRon в комментариях. Я только учусь, поэтому приятно видеть, что есть более одного способа выполнить работу. Спасибо, что поделились знаниями. - person TechFA; 04.03.2021

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

$Unit = "TB"
$UnitCalc = switch($Unit) {
  "MB" { 1MB }
  "GB" { 1GB }
  "TB" { 1TB }
  default { throw "unhandled unit '$Unit'" }
}

$capacity = 20TB / $UnitCalc # gives 20

Вы можете сократить до одной строки с помощью хэш-таблицы, если вам не нужна обработка ошибок, но обратите внимание, что это дает $UnitCalc = $null для неизвестных размеров единиц:

$UnitCalc = @{ "MB" = 1MB; "GB" = 1GB; "TB" = 1TB }[$Unit]
person mclayton    schedule 28.02.2021

Как насчет кода, который определяет наилучший размер для использования?

Clear-Host 

$Size = 22373741824

#Updated per MClayton's suggestion, Thanks! 
$Unit = Switch ($Size) {
          {$Size -gt 1PB} { 'PB' ; Break }
          {$Size -gt 1TB} { 'TB' ; Break }
          {$Size -gt 1GB} { 'GB' ; Break }
          {$Size -gt 1Mb} { 'MB' ; Break }
          Default         { 'KB'         }
        }

"Unit is: $unit"

$SourceCapacity = [math]::Round(($Size/$("1"+$Unit)),2)

"Source Drive capacity is: $SourceCapacity $Unit"

Конечно, вы замените тестовую переменную $Size полученной вами переменной значения и удалите операторы вывода отладки.

ХТН

person RetiredGeek    schedule 01.03.2021
comment
PowerShell имеет встроенное понимание ПБ, ТБ, ГБ и т. д. Например, PS> 1gb выводит 1073741824, поэтому вам не нужно использовать [math]::Pow для этих единиц — вы можете просто сказать что-то вроде {$Size -gt 1pb }... - person mclayton; 01.03.2021
comment
Маклейтон, спасибо, я должен был это знать... ДУХ! - person RetiredGeek; 01.03.2021