奇怪的PowerShell执行输出捕获行为

时间:2012-11-10 10:32:35

标签: powershell powershell-v3.0

我正在编写一个简单的PowerShell脚本来处理mkvinfo的输出。它捕获mkvinfo的输出,存储在变量$ s中,并在$ s上进行一些后处理。奇怪的是,当$ s有内容时,我无法从中提取子字符串。

我收到的错误消息是:

  

使用“1”参数调用“Substring”的异常:“startIndex不能大于字符串的长度。   参数名称:startIndex“

这是一个示例代码:

$filePath = $folder + $file.name
$mkvinfoExe = "C:\mkvinfo.exe"
$s = & $mkvinfoExe $filePath
$s | out-host
$s.Substring($s.Length-1) | out-host

2 个答案:

答案 0 :(得分:3)

您确定$s是字符串而不是数组吗?如果是数组,$s.Length将是数组中元素的数量,您可能会得到错误。

例如:

PS > $str = @("this", "is", "a")
PS > $str.SubString($str.Length - 1)
Exception calling "Substring" with "1" argument(s): "startIndex cannot be larger than length of string.
Parameter name: startIndex"
At line:1 char:1
+ $str.SubString($str.Length - 1)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

答案 1 :(得分:1)

刚发现因为mkvinfo输出多行,$ s实际上是一个String数组(或List?)。切换到$ s [0] .Substring($ s [0] .Length-1)解决它。