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

Shr*_*ut1 3 arrays string powershell split multidimensional-array

翻译:博士

使用 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
Run Code Online (Sandbox Code Playgroud)

期望的结果:

我想将字符串分割两次:

  1. 在新行上分割(第一个维度)
  2. 在行内以逗号分割(第二个维度)

我希望它的最终结果是一个我可以引用的二维数组。(例如: $services[0][0]等)

使用的命令:

为了完成新的行分割,我一直在使用以下命令:

$services= $services -split "\n"
Run Code Online (Sandbox Code Playgroud)

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

$services[0]
Run Code Online (Sandbox Code Playgroud)

PowerShell 仅显示第一行$services

接下来我使用:

$services[0] = $services[0] -split ','
Run Code Online (Sandbox Code Playgroud)

问题:

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

我哪里错了?

Mat*_*sen 6

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

相反,当解析器发现您尝试将新数组分配给现有字符串数组中的一项时$services,它会自动将新数组转换为字符串,并通过 . 连接起来$OFS。由于$OFS默认为空格,因此您实际上需要转换该字符串:

SUPER-PC,Microsoft Office ClickToRun Service,ClickToRunSvc,C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service,Auto
Run Code Online (Sandbox Code Playgroud)

到这个字符串中:

SUPER-PC Microsoft Office ClickToRun Service ClickToRunSvc C:\Program Files\Microsoft Office 15\ClientX64\OfficeClickToRun.exe /service Auto
Run Code Online (Sandbox Code Playgroud)

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

$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
'@

# I prefer a more OS-agnostic newline pattern
$Services = $Services -split "`r?`n"

# Create a new array, defaults to Object[], so can contain arrays as well
$MultiDimensionalServices = @()

# Iterate over each string in $Services
foreach($ServiceString in $Services){
    # use the unary array operator (,) to avoid flattening the array
    $MultiDimensionalServices += ,@($ServiceString -split ',')
}
Run Code Online (Sandbox Code Playgroud)