Я не могу использовать оператор PowerShell Switch, когда задействованы 64-битные целые числа.
У меня есть следующий фрагмент PowerShell:
PS D:\> cat .\dirSize.ps1
$dirName = $args[0]
$dirSize = [uint64]( ( dir "$dirName" -force -recurse | measure -property length -sum ).Sum )
switch( $dirSize ) {
{ $_ -in 1tb..1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
}
Я получаю эту ошибку:
Cannot convert value "1099511627776" to type "System.Int32". Error: "Value was either too large or too small for an Int32."
At C:\Users\sebastien.mansfeld\psh\dirSize.ps1:4 char:4
+ { $_ -in 1tb..1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastIConvertible
Поэтому я попытался преобразовать тестовую строку переключателя в uint64
, но это не сработало:
switch( $dirSize ) {
{ [uint64]$_ -in [uint64]1tb..[uint64]1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
}
Я получаю то же сообщение об ошибке.
Я ожидаю, что условие переключения сработает.
Измените свое условие на что-то более эффективное, что не будет выдавать ошибку за пределами границ:
switch ( $dirSize ) {
{ $_ -ge 1tb -and $_ -le 1pb } {
'{0:n2} TiB' -f ( $dirSize / 1tb ); break
}
}
Вы также можете использовать модуль PSTree, который имеет эту встроенную функциональность. Например, ваш текущий код можно заменить на:
(Get-PSTree $dirName -Depth 0 -RecursiveSize -Force).GetFormattedLength()
Чтобы установить его, вы можете:
Install-Module PSTree -Scope CurrentUser
@SebMa ну, чтобы использовать его, сначала нужно установить модуль..
Я установил этот модуль как CurrentUser
scope.
@SebMa Import-Module PSTree
сначала пример: i.imgur.com/bgADfV9.png
диапазон (..
) работает только со значениями [int32]
.
Просто используйте
switch ( $dirSize ) {
# less or equal 1PB or more or equale 1TB
{ (1PB -ge $_) -and (1TB -le $_) } {
'{0:n2} TiB' -f ( $dirSize / 1TB )
break
}
# { other comparsions } { other results }
# default { default result }
}
Существует ли документация Microsoft, подтверждающая, что диапазоны работают только со значениями [int32]
?
@SantiagoSquarzon ой, я виноват. Я даже написал "или" в комментарии. Спасибо за наводку
Оператор
-in
«сообщает, появляется ли проверочное значение в коллекции эталонных значений». Таким образом, он, скорее всего, преобразует диапазон..
в массив... Даже если бы он поддерживал 64-битные значения,1tb..1pb
не хватило бы 8 петабайт оперативной памяти.