从 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=].
-match
,regular-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
开关来请求仅字符串输出。
至于你试过的:
如上所述,通过不使用 -ExpandProperty
、select 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()
或使用可扩展字符串,如上所示。
我在 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=].-match
,regular-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 thatSelect-String
输出中提取Line
属性 值。- 请注意,在 PowerShell [Core] v7+ 中,您可以省略此步骤,而是使用
Select-String
的(新)-Raw
开关来请求仅字符串输出。
- 请注意,在 PowerShell [Core] v7+ 中,您可以省略此步骤,而是使用
至于你试过的:
如上所述,通过不使用 -ExpandProperty
、select 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()
或使用可扩展字符串,如上所示。