如何实现PowerShell大小写不敏感查询?VM筛选条件失效问题
解决PowerShell不区分大小写的VM筛选问题
原脚本存在的问题
- 逻辑运算符优先级错误:
-and优先级高于-or,原条件会被解析为「VM名称包含小写$vm,或者(VM名称包含大写$vm且OS包含$so)」,不符合你需要的「同时满足VM名称包含$vm且OS包含$so」的要求。 - 字符串匹配区分大小写:
String.Contains()方法默认区分大小写,导致输入小写red无法匹配Red格式的OS名称。
解决方案1:使用PowerShell原生-match运算符(推荐)
-match默认不区分大小写,直接用来判断字符串包含关系,同时修正逻辑条件的括号:
$so = Read-Host -Prompt 'Input the OS' $vm = Read-Host -Prompt 'Input the name' # 查询逻辑 Get-VM | Where-Object { $_.Name -match [regex]::Escape($vm) -and $_.Guest.OSFullName -match [regex]::Escape($so) } | Select-Object Name | Format-Table
[regex]::Escape($vm):避免用户输入的特殊字符(如.、*)被当作正则表达式元字符处理,确保是纯字符串匹配。-match:默认不区分大小写,直接实现包含匹配。- 括号包裹的逻辑明确:同时满足VM名称包含输入值、OS名称包含输入值。
解决方案2:使用String.Contains的忽略大小写重载
如果更倾向于用Contains方法,可以指定StringComparison.OrdinalIgnoreCase参数来忽略大小写,同时修正逻辑条件:
$so = Read-Host -Prompt 'Input the OS' $vm = Read-Host -Prompt 'Input the name' # 查询逻辑 Get-VM | Where-Object { ($_.Name.Contains($vm, [StringComparison]::OrdinalIgnoreCase)) -and ($_.Guest.OSFullName.Contains($so, [StringComparison]::OrdinalIgnoreCase)) } | Select-Object Name | Format-Table
[StringComparison]::OrdinalIgnoreCase:指定忽略大小写的字符串比较规则,避免因系统区域设置影响匹配结果。- 明确用括号包裹两个条件,用
-and连接,确保同时满足筛选要求。
内容的提问来源于stack exchange,提问作者BrennQuin
相关产品推荐
相关产品推荐

