You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现PowerShell大小写不敏感查询?VM筛选条件失效问题

解决PowerShell不区分大小写的VM筛选问题

原脚本存在的问题

  1. 逻辑运算符优先级错误:-and优先级高于-or,原条件会被解析为「VM名称包含小写$vm,或者(VM名称包含大写$vm且OS包含$so)」,不符合你需要的「同时满足VM名称包含$vm且OS包含$so」的要求。
  2. 字符串匹配区分大小写: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:22:03