【问题标题】:Remove the at symbol ( @ ) and curly bracket ( { ) from Select-Sring output in Powershell从 Powershell 中的 Select-String 输出中删除 at 符号 ( @ ) 和大括号 ( { )
【发布时间】:2020-01-29 22:52:29
【问题描述】:

我在 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

【问题讨论】:

  • 使用Select-Object -ExpandProperty name 而不是Select-Object -Property name

标签: powershell findstr select-string


【解决方案1】:

您可以按如下方式简化和加快您的命令

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

注意:需要@()array-subexpression operator,以确保-match数组上运行,即使只有一个文件发生存在于当前目录中。


使您的原始命令工作

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

  • select -ExpandProperty line 同样从Select-String 输出的Microsoft.PowerShell.Commands.MatchInfo 实例中提取Line 属性值。

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

至于你尝试了什么

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

Select-Stringstringify 如有必要,它可以对其输入对象执行字符串搜索,从而得到您所看到的表示;这是一个模拟:

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

顺便说一句:

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

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

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多