Вы индексируете ([...]
) в строку $Up_Down
, что означает вы возвращаете один символ , то есть [char]
(System.Char
) экземпляр .
Приведение [char]
к [int]
дает его кодовую точку Unicode ("значение ASCII "), не ди git, который символ представляет.
Например, символ 6
является символом Unicode DI GIT SIX с кодовой точкой U+0036
; 0036
является шестнадцатеричной формой числовой c кодовой точки, а десятичная форма шестнадцатеричного 0x36
является 54
.
PS> [int] "6w0d"[0]
54 # !! Same as: [int] [char] "6"
Для интерпретации символа как di git, вам нужен промежуточный [string]
каст :
PS> [int] [string] "6w0d"[0]
6 # OK - a string is parsed as expected; same as: [int] "6"
Если вы используете строку вместо char
до [int]
, PowerShell эффективно вызывает System.Int32.Parse
за кадром следующим образом: [int]::Parse($string, [cultureinfo]::InvariantCulture)
.
Обратите внимание, что PowerShell имеет нет char
литералы - в отличие от C#, '...'
цитирование также создает строки (дословные), а [int] '6'
дает целое число 6
, как и [int] "6"
.
И наоборот, вам необходимо явное приведение [char]
для преобразования односимвольного строкового литерала в [char]
; например, [char] '6'
; многосимвольная строка вызовет приведение к fail .
Решение в контексте вашей команды:
[int]$weeks = if ($Up_Down -match "w"){[string] $Up_Down[$Up_Down.IndexOf('w')-1]} Else {0}
[int]$days = if ($Up_Down -match "d"){[string] $Up_Down[$Up_Down.IndexOf('d')-1]} Else {0}
Однако Я предлагаю решить проблему по-другому :
[int] $totalDays = 0
if ($UP_Down -match '^(?:(?<weeks>\d+)w)?(?:(?<days>\d+)d)?$') {
[int] $weeks, [int] $days = $Matches.weeks, $Matches.days
$totalDays = 7 * $weeks + $days
} # else: string wasn't in expected format.