powershell - Arrays and -contains - 测试数组元素中的子字符串
问题描述
我正在尝试过滤掉特定组中的用户。
我在变量中得到以下输出:
Group1
Group2
etc...
保存在数组中的每行一组。我试图只过滤掉一个特定的组。但是当我使用-contains
它时,它总是说$false
,即使小组在那里。
我的代码:
$group = get-aduser -identity name -properties memberof |
select-object -expandproperty memberof | %{ (get-adgroup $_).name }
$contains = $group -contains "string"
$contains
$false
即使数组中包含包含字符串的元素...
我错过了什么?
解决方案
看起来您的误解是您希望 PowerShell 的-contains
运算符对 LHS 数组的元素执行子字符串匹配。
相反,它对数组的元素执行相等测试- 就像-eq
那样 - 有关详细信息,请参阅此答案。
为了对数组的元素执行文字子字符串匹配,请使用:
# With non-literal search strings:
[bool] $contains = $group -match ([regex]::Escape($someString))
# With a string literal that doesn't contain regex metachars.,
# escaping isn't needed.
[bool] $contains = $group -match 'foo'
# With a string literal with metachars., you must individually \-escape them.
[bool] $contains = $group -match 'foo\.bar'
笔记:
上面显示了一种强大的通用方法,可确保使用 将搜索字符串视为文字值
[regex]::Escape()
,这是必要的,因为-match
需要正则表达式(正则表达式)作为其 RHS(搜索模式)。逃避并不总是必要的。具体来说,只有所谓的元字符(在正则表达式中具有特殊含义的元字符,例如
.
)才需要它,并且当您使用字符串文字时,您可以选择直接\
- 转义它们;例如,要搜索文字 substringa.b
,您可以通过'a\.b'
.- AD 组名称很可能不需要转义,但重要的是要知道一般需要转义。
与 PowerShell 中的所有运算符一样,默认情况下匹配不区分大小写;使用
-cmatch
变体进行区分大小写的匹配。上面约束的
[bool]
类型用于确保将-match
操作的结果转换为布尔值:- 虽然
-match
直接返回带有标量(非数组)LHS的布尔值,但对于数组LHS,它充当过滤器,并返回匹配的数组元素;在布尔上下文中解释,例如在if
条件中,通常仍然给出预期结果,因为非空数组被解释为$true
,而空数组被解释为$false
; 再次,但是重要的是要知道区别。
- 虽然
这在实践中很少会成为性能问题,但值得注意的是
-match
,由于充当数组的过滤器,总是匹配所有数组元素- 一旦找到第一个匹配项,它就不会停止,-contains
和-in
运营商做。从好的方面来说,您可以使用
-match
自己来获取匹配的元素。
-contains
执行子字符串匹配的错误期望可能是由于与名称相似但不相关的方法String.Contains()
混淆而产生的,该方法确实执行字面子字符串匹配;例如,'foo'.Contains('o')
产量$true
。
另请注意,在Windows PowerShell中始终.Contains()
区分大小写,默认情况下在PowerShell (Core) 7+中。
PowerShell没有用于文字子字符串匹配的运算符。
但是,您可以将 PowerShell 的通用数组过滤功能与.Contains()
字符串方法结合起来 - 但请注意,这通常会比该-match
方法执行(可能很多)差。
一种性能合理的替代方法是使用 PSv4+.Where()
数组方法,如下所示:
# Note: Substring search is case-sensitive here.
[bool] $contains = $group.Where({ $_.Contains("string") }, 'First')
从好的方面来说,一旦找到第一个匹配项,这种方法就会停止匹配。
推荐阅读
- r - 计算增长增长,按类型分组(使用 R)
- reactjs - 反应本机错误:npm ERR!无法从根项目解析依赖 metro-react-native-babel-preset@"^0.59.0"
- sql - 按小时拆分日期/时间数据并将日期/时间范围扩展到行
- highcharts - HIGHCHARTS:导出事件无法访问 x 轴标签
- html - 在下拉选择中配置 HTML 正文
- wpf - 如何将 DataGrid 排序事件绑定到 Prism ViewModel DelegateCommand
- java - 如何从 Libgdx 中的 iOS 模块访问 Assets 文件夹中的文件?
- omnet++ - 如何更改静脉中的数据速率?
- javascript - 为什么我需要 2 个 requestAnimationFrame 调用来等待渲染的 dom
- xml - 如何使用 XML Annotation 可视化数据集并将其用于 YOLOv5