json - 如何将命令的结果转换为 PowerShell 中的二维数组?
问题描述
已知
考虑以下命令:
ls -l
-rwx------ 123 ladiesman217 root 549 Apr 01 01:01 one.txt
-rwx------ 123 ladiesman217 root 549 Apr 01 02:02 two.txt
-rwx------ 123 ladiesman217 root 549 Apr 01 03:03 three.txt
当通过管道传输到 时ConvertTo-Json
,它会创建一个数组,如下所示:
ls -l | ConvertTo-Json
[
"-rwx------ 123 ladiesman217 root 549 Apr 01 01:01 one.txt",
"-rwx------ 123 ladiesman217 root 549 Apr 01 02:02 two.txt",
"-rwx------ 123 ladiesman217 root 549 Apr 01 03:03 three.txt"
]
客观的
有没有一种快速的方法可以将其变成二维数组,例如:
[
[
"-rwx------",
"123",
"ladiesman217",
"root",
"549",
"Apr",
"01",
"01:01",
"one.txt"
],
[
"-rwx------",
"123",
"ladiesman217",
"root",
"549",
"Apr",
"01",
"02:02",
"two.txt"
],
[
"-rwx------",
"123",
"ladiesman217",
"root",
"549",
"Apr",
"01",
"03:03",
"three.txt"
]
]
从本质上讲,这就像将 anobject
转换为array
.
如何将命令的结果转换为 PowerShell 中的二维数组?
解决方案
要制作与您展示的完全相同的二维数组,您可以执行此操作。
ls -l | Select-Object -Skip 1 | %{, -split $_ | ConvertTo-Json}
然而,为了制作具有属性的可用对象,我喜欢这个食谱。
- 切换语句
- 足够的正则表达式
- 一小撮字符串操作
- 一元运算符
- PSCustomObject
$output = switch -Regex (ls -l){
'(.+?)\s(\w{3}\s.+?:\d{1,})\s(.+?)$' {
, -split $matches.1 | Foreach-Object {
[PSCustomObject]@{
Permission = $_[0]
Links = $_[1]
Owner = $_[2]
Group = $_[3]
Size = $_[4]
Modified = $matches.2
FileName = $matches.3
}
}
}
}
$output | Format-Table
TL;博士
switch 语句非常适合读取来自文件、命令输出等的行。我们只抓取那些与正则表达式模式匹配的行。
正则表达式解释
.+?
表示匹配任意数量的任意字符,但尽可能少。( )
将与括号中的模式匹配的任何内容放在捕获组中。默认情况下,将编号组,如果您愿意,可以命名它们。\s
匹配一个空格\w{3}
匹配 3 个单词字符:
匹配文字冒号\d{1,}
匹配一个或多个数字$
行尾。(在此之前的匹配必须在行尾)
因此,我们捕获 中的前 5 列$matches.1
、中的时间戳$matches.2
和中的其余文本(应该是文件/文件夹名称)$matches.3
从那里我们$matches.1
通过将拆分放在第一位来拆分空间。通常,当您拆分并向下发送管道时,它将一次一个。
-split "a b c" | %{"$_"}
通过将逗号添加到前面,将其转换为数组并按原样发送到管道中。
, -split "a b c" | %{"$_"}
然后我们只需将每个值放在正确的位置。你也可以变成一个 JSON 对象。
推荐阅读
- python-3.x - 首次打开窗口时无法单击 Tkinter 文本框
- node.js - 在 nodejs 中使用 node-record-lpcm16 的 IBM Speech to Text
- python - 将小部件添加到 Tkinter 颜色选择器
- javascript - 如何使用 express.js 将文件传递到我的服务器
- ios - 如何在同一个容器中解码 DynamicKeys 和 CodingKeys?
- javascript - 当我发送带有图像的发布请求时得到这个:错误:请求失败,状态码 409
- node.js - 如何让 cosmosdb 触发一个 azure 函数并调用另一个 http 函数
- sql - 得到 20 条 sql 查询的最佳 8 条结果?
- python - 'str' 对象在使用按类查找元素时不可调用 | 蟒蛇硒
- r - 在一行代码中创建多列,其中每一列是通过合并不同的列来创建的