PowerShell将字符串拆分为二维数组

时间:2016-06-13 17:17:49

标签: arrays string powershell multidimensional-array split

TL:DR

使用PowerShell我想首先用新行字符(\ n)拆分文本字符串,将其存储到数组中,然后用逗号将这些数组条目拆分为二维数组。我无法访问(或可能创建)第二维中的任何信息。

信息:

我有以下字符串(存储为$services):

SUPER-PC,Microsoft Office ClickToRun Service,ClickToRunSvc,C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service,Auto
SUPER-PC,Adobe Acrobat Update Service,AdobeARMservice,C:\Program Files (x86)\Common Files\Adobe\ARM\1.0\armsvc.exe,Auto

期望的结果:

我想将字符串拆分两次:

  1. 拆分新行(第一维)
  2. 拆分行内的逗号(第二维)
  3. 我希望这个结果是一个二维数组,我可以参考。 (例如: $services[0][0]等。)

    使用的命令:

    要完成新的行拆分,我一直在使用以下命令:

    $services= $services -split "\n"
    

    要访问新数组结构中的拆分字符串,我可以执行以下操作:

    $services[0]
    

    PowerShell仅显示$services

    的第一行

    接下来我使用:

    $services[0] = $services[0] -split ','
    

    问题:

    当我尝试使用$services[0][0]访问第一个数组的第二个维时,它显示S这是字符数组的第一个字符(" SUPER-PC"是字符串的开头),而不是我想要创建的二维数组。

    我哪里错了?

4 个答案:

答案 0 :(得分:3)

-split返回类型为string[]的对象,这意味着您无法在不更改整个数组的类型的情况下将字符串以外的任何内容分配给单个项目。

相反,当解析器发现您正在尝试将新数组分配给现有$services字符串数组中的某个项时,它会自动将新数组转换为字符串,并由{连接} {1}}。由于$OFS默认为空格,因此您基本上会转换此字符串:

$OFS

进入这个字符串:

SUPER-PC,Microsoft Office ClickToRun Service,ClickToRunSvc,C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service,Auto

相反,创建一个全新的数组来保存结果数组:

SUPER-PC Microsoft Office ClickToRun Service ClickToRunSvc C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service Auto

答案 1 :(得分:2)

是否有某些原因你没有这样做:

$ConvertedServices = $Services | ConvertFrom-Csv -Header 'ComputerName','ServiceDescription','ServiceName','CommandLine','StartUp'

然后:

$ConvertedServices[0].ComputerName

PowerShell中的多维数组确实有效,但它们与IMX一起使用起来很小,特别是对于字符串,因为字符串通常被视为你在这里遇到的字符数组。

答案 2 :(得分:2)

好的我讨厌自己回答,但这比我想的要简单得多......其他两个答案都是有效的,Mathias指出我有明显的疏忽。

$string = $string -split "," $string = $string.split(",")相同,正如Mathias所说:

  

-split返回string[]类型的对象,这意味着你不能   将字符串以外的任何内容分配给单个项目而不进行更改   整个数组的类型。

所以我最终利用了:

$services= $services.split("`r`n")

然后

$services[0]= $services[0].split(",")

然后我能够使用services[0][0]

成功访问多维数组的第二维

此外,培根比特的回答很可能更好比我的回答;我的回答只是以最简单的方式解决了我的问题。

答案 3 :(得分:1)

试试这个

$Services=("SUPER-PC,Microsoft Office ClickToRun Service,ClickToRunSvc,C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service,Auto",
"SUPER-PC,Adobe Acrobat Update Service,AdobeARMservice,C:\Program Files (x86)\Common Files\Adobe\ARM\1.0\armsvc.exe,Auto")

$ConvertedServices = $Services | ConvertFrom-String -Delimiter "," -PropertyNames 'ComputerName','ServiceDescription','ServiceName','CommandLine','StartUp'
$ConvertedServices[0].ComputerName