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)
期望的结果:
我想将字符串分割两次:
我希望它的最终结果是一个我可以引用的二维数组。(例如: $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”是字符串的开头),而不是我想要创建的二维数组。
我哪里错了?
-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)