$ string.Substring索引/长度异常

时间:2015-09-29 17:31:35

标签: powershell

我在使用Substring时遇到此异常:

Exception calling "Substring" with "2" argument(s): "Index and length must
refer to a location within the string.
Parameter name: length"
At line:14 char:5
+     $parameter = $string.Substring($string.Length-1, $string ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

我理解它的含义,但我不确定为什么我得到索引和长度是正确的。

我正在做以下事情:

$string = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\hid\Parameters\0"
$parameter = $string.Substring($string.Length-1, $string.Length)

即使尝试对其进行硬编码也会引发相同的异常:

$parameter = $string.Substring(68, 69)

我有什么遗失的吗?

3 个答案:

答案 0 :(得分:4)

错误消息试图告诉您的是:子字符串的开头加上子字符串的长度(第二个参数)必须小于或等于字符串的长度。第二个参数不是子字符串的结束位置。

示例:

'foobar'.Substring(4, 5)

这会尝试从第5个字符开始提取长度为5的子字符串(索引从0开始,因此第5个字符的索引为4):

foobar
    ^^^^^  <- substring of length 5

意味着子字符串的字符3-5将位于源字符串之外。

必须将子字符串语句的长度限制为长度减去子字符串的起始位置:

$str   = 'foobar'
$start = 4
$len   = 5
$str.Substring($start, [Math]::Min(($str.Length - $start), $len))

或者,如果你只想从给定位置开始字符串的尾端,你就完全省略了长度:

$str = 'foobar'
$str.Substring(4)

答案 1 :(得分:3)

你的第一个参数是字符串中的起始位置,第二个参数是从该位置开始的子字符串的长度。位置68和69处的2个字符的表达式为:

$parameter = $string.Substring(68,2)

答案 2 :(得分:3)

如果字符串的最后一个字符是你想要的,你可以通过简单地将字符串视为字符数组并使用相应的索引表示法来实现这一点:

'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\hid\Parameters\0'[-1]