从 Powershell 的 Select-Sring 输出中删除符号 (@) 和大括号 ({)

Remove the at symbol ( @ ) and curly bracket ( { ) from Select-Sring output in Powershell

我在 Powershell 中解析文件名,当我使用 Get-ChildItem | select name 时,我得到了文件的干净输出:

file1.txt file2.txt file3.txt

但是当我尝试使用 Select-String 缩小这些文件的范围时,我在输出前得到了一个奇怪的 @{

Get-ChildItem | select name | Select-String -Pattern "1"

@{file1.txt}

我是否缺少某个参数?如果我用 findstr 而不是 Select-String 管道,它就像一个魅力:

Get-ChildItem | select name | Findstr "1"

file1.txt

您可以简化和加速您的命令,如下所示:

@((Get-ChildItem).Name) -match '1'

注:需要@()array-subexpression operator来确保-match数组进行操作,即使只有一个文件恰好存在于当前目录中

  • (...).Name 使用 member-access enumeration 从 return 编辑的文件信息对象中提取所有 Name 属性 值17=].

  • -matchregular-expression matching operator,由于在 array 值上操作,returns 子-匹配值数组。


使您的原始命令正常工作

Get-ChildItem | select -ExpandProperty Name | 
  Select-String -Pattern "1" | select -ExpandProperty Line
  • select -ExpandProperty Name 使 select (Select-Object) return 只有 Name 属性 ;默认情况下(隐含 -Property 参数),一个 自定义对象 有一个 Name 属性 是 returned.

  • select -ExpandProperty line 类似地从 Microsoft.PowerShell.Commands.MatchInfo instances that Select-String 输出中提取 Line 属性 值。

    • 请注意,在 PowerShell [Core] v7+ 中,您可以省略此步骤,而是使用 Select-String 的(新)-Raw 开关来请求仅字符串输出。

至于你试过的

如上所述,通过不使用 -ExpandPropertyselect name(隐含的 -Property 参数)创建了一个 自定义对象[pscustomobject] 实例)与 Name 属性.

Select-String stringifies 它的输入对象,如有必要,因此它可以对它们执行字符串搜索,从而产生您看到的表示;这是一个模拟:

# Stringify a custom object via an expandable string ("...")
PS> "$([pscustomobject] @{ Name = 'file1.txt' })"
@{Name=file1.txt}

顺便说一句:

  • 上面的字符串化方法本质上就像是在输入对象上调用.ToString()[1],结果往往是没用 字符串表示(默认情况下,只是 type 名称);更有用和直观的字符串化是使用 PowerShell 丰富的输出格式化系统,即使用您将在控制台 中看到的字符串表示形式 ;改变 Select-String 的行为是 this feature request on GitHub.
  • 的主题

[1] 从 PowerShell Core 7.0.0 开始,直接在 [pscustomobject] 实例上调用 .ToString() 实际上仍然是 broken- rc.2,由于 this bug;解决方法是调用 .psobject.ToString() 或使用可扩展字符串,如上所示。