编辑 Powershell 对象

时间:2021-02-27 21:31:45

标签: powershell

我正在使用 powershell 运行如下命令:

$getlist=rclone sha1sum remote:"\My Pictures\2009\03" --dry-run 
Write-Output $getlist

输出一个带有结果的对象。问题是我只想要这些结果的第一列。我尝试过诸如 custom-format --Depth 1 和其他 *-format 命令之类的东西,但它们对这个对象不起作用??

enter image description here

2 个答案:

答案 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 - 单个空白字符,如空格和制表符
  • .* - 任意字符,零次或多次