我正在使用 powershell 运行如下命令:
$getlist=rclone sha1sum remote:"\My Pictures\2009\03" --dry-run
Write-Output $getlist
输出一个带有结果的对象。问题是我只想要这些结果的第一列。我尝试过诸如 custom-format --Depth 1 和其他 *-format 命令之类的东西,但它们对这个对象不起作用??
答案 0 :(得分:1)
输出一个带有结果的对象
虽然这在技术上是正确的,但更具体地说,它是一个 [object[]]
类型的 行数组([string]
实例),用于分配 流输出行 - 由外部 rclone
程序生成 - 到隐式创建的 PowerShell 变量。 (PowerShell 创建的数组是 [object[]]
类型的,即使所有元素都属于同一类型,例如本例中的 [string]
)。
PowerShell 基本上只在与外部程序通信时“说文本”。
因此,要从这些行中提取子字符串,您必须执行文本解析,正如 AdminOfThings 对问题的评论所暗示的那样。
一种简化的方法是使用-split
operator的一元形式:
# Simulate lines input whose first whitespace-separated token is to
# be extracted.
$getlist = 'foo bar baz', 'more stuff here'
$getlist.ForEach({ (-split $_)[0] })
以上产生:
foo
more
zett42's helpful answer 展示了一种更简单的替代方案,它依赖于 -replace
运算符(以及其他)直接对 数组 的每个元素进行操作的能力- 重视 LHS。
但是,如果您想提取多个列值,-split
方法很有用。
如果您不需要/不想首先在内存中捕获所有外部程序(rclone
)的输出,您可以使用流< /em> 在管道中处理,通过 ForEach-Object
cmdlet:
'foo bar baz', 'more stuff here' | ForEach-Object { (-split $_)[0] }
注意:虽然比预先收集内存中的所有行稍慢,但基于管道的方法的优点是减少了内存负载:只有提取的子字符串保留在内存中(如果分配给变量)。
答案 1 :(得分:1)
您可以使用 regular expression 删除输出中不需要的部分:
$getlist = $getlist -replace '\s.*'
当 PowerShell 运算符(例如 -replace
)应用于集合时,它将单独应用于每个元素,从而创建一个存储结果的新数组(请参阅 Substitution in a collection)。
正则表达式删除从第一个空格到字符串末尾的所有内容。
正则表达式细分:
\s
- 单个空白字符,如空格和制表符.*
- 任意字符,零次或多次