在Windows 7环境中,Get-Content返回System.Object []而不是System.String

问题描述

我有一个脚本,该脚本是我在Windows 10环境中编写的,安装了.Net 4.7.03056,可以正常工作。但是,如果改为在单独的Windows 7环境中运行(不确定是否安装了.Net版本),则脚本会遇到MethodNotFound异常:

方法调用失败,因为[System.Object []]不包含名为'IndexOf'的方法

以下是导致问题的代码

$Result = Get-Content $LogDirectory\java_output.txt
$MCPindex = $Result.IndexOf('MCP devices:')

java_output.txt的内容应为:

Serial number [Description] [ID]
FTDI devices:
MCP devices:
0001234567 [MCP2200 USB Serial Port Emulator microchip Technology Inc.] [id=0]

在Windows 10中运行并将$ Result传递给get-member时,数据类型为System.String,它确实包含IndexOf方法,因此没有问题。

在Windows 7环境中运行时,抛出的异常消息表示$ Result是System.Object []。我目前无法直接访问该环境进行故障排除,因此对于这种行为的可能嫌疑人,我目前不知所措。任何见识将不胜感激!

解决方法

PowerShell v2 (Windows 7最初附带的)未在阵列上(例如在.IndexOf()上公开[object[]]方法从变量中用System.Object[]读取的文件中捕获多行时获得的(Get-Content个数组。

原因是 .IndexOf()不是数组的 direct 方法,而是通过System.Collections.IList 接口的实现提供的 ,并且只有在PSv3 +中,接口方法也会在PowerShell中出现


最简洁但不明显的解决方法是在PSv2中使用 reflection

$MCPIndex = [Collections.IList].GetMethod('IndexOf').Invoke($Result,'MCP devices:')