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
期望的结果:
我想将字符串拆分两次:
我希望这个结果是一个二维数组,我可以参考。 (例如: $services[0][0]
等。)
使用的命令:
要完成新的行拆分,我一直在使用以下命令:
$services= $services -split "\n"
要访问新数组结构中的拆分字符串,我可以执行以下操作:
$services[0]
PowerShell仅显示$services
接下来我使用:
$services[0] = $services[0] -split ','
问题:
当我尝试使用$services[0][0]
访问第一个数组的第二个维时,它显示S
这是字符数组的第一个字符(" SUPER-PC"是字符串的开头),而不是我想要创建的二维数组。
我哪里错了?
答案 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