关于管道筛选中select-string的一个疑惑


PowerShell交流中心分类: Powershell基础关于管道筛选中select-string的一个疑惑
vaf 管理员 提问于 2周 前

在PowerShell中我们可以用name参数模糊匹配,这点算是比较方便的。
PS C:\Users\vaf> Get-Process -Name “360*”
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
——- —— —– —– —— — — ———–
305 16 2884 6468 0.56 11956 1 360bdoctor
308 26 17564 9884 1.11 11800 1 360leakfixer
1074 94 133600 124876 127.69 9184 1 360se
2454 116 159340 59492 579.19 12372 1 360se
297 32 68368 44816 4.94 13052 1 360se
297 58 79400 12556 6.88 16836 1 360se
305 32 48544 3900 6.33 18180 1 360se
384 63 116688 130780 43.05 18772 1 360se
303 52 45252 3008 12.50 22288 1 360se
233 17 11780 17924 0.08 25676 1 360se
295 34 39364 3680 0.91 29088 1 360se
281 24 42964 14848 788.91 29328 1 360se
857 35 164808 191276 339.75 29792 1 360se
319 79 167816 100152 566.31 34380 1 360se
4113 312 469300 56304 6,229.48 9884 1 360tray

PS C:\Users\vaf>
再看看这样的筛选方式,
PS C:\Users\vaf> Get-Process |Select-String -Pattern “360”
System.Diagnostics.Process (360bdoctor)
System.Diagnostics.Process (360leakfixer)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360se)
System.Diagnostics.Process (360tray)
System.Diagnostics.Process (nethelper360)

PS C:\Users\vaf>
这变成了一个个对象?select-string不应该是类似grep整行输出的么?
比如说我要判断一个命令没有alias别名,
PS C:\Users\vaf> Get-Alias |select -ExcludeProperty “N*” |Select-String -Pattern “se”
erase
ise
select
set

PS C:\Users\vaf>
这样写箭头后面的原来的名称就没有被匹配到,只匹配到了别名名称。请求前辈解答。

×用微信扫描并分享
1 次回答
最佳答案
Mooser Lee 管理员 回答于 2周 前
  1. Get-Process -Name “360*” 这样的过滤是基于对象的,过滤后,集合中还是对象,针对特定的对象输出特定的format格式到控制台,是由《ETS扩展类型系统》配置和控制的。
  2. Get-Process |Select-String -Pattern “360” 这样的过滤:是因为Select-String只能接收字符串对象,所以当管道中的对象进入到Select-String 以后,会调用该对象的ToString()方法,先转换成字符串,然后再进行匹配,输出到控制台以后自然就是字符串了,形如System.Diagnostics.Process (360bdoctor)。