about_Case-Sensitivity

简短说明

PowerShell 在保留大小写的同时尽可能不区分大小写。

详细说明

作为一般原则,PowerShell 在保留大小写时不区分大小写,而不是破坏基础 OS。

对于大多数作,基于 Windows 的系统不区分大小写。 但是,对于大多数作,非 Windows 系统区分大小写,尤其是文件系统和环境变量访问。

对于以下方面,PowerShell 保证在所有系统上不区分大小写:

  • 变量名称
  • 运算符名称
  • 非字典成员访问
  • PowerShell 命令和别名的命令发现。 这不包括 ExternalScript 和 Application 命令。
  • 参数名称和别名
  • PowerShell 语言关键字
  • using namespace 语句
  • 类型文本
  • #Requires 语句
  • 基于注释的帮助关键字
  • PSProvider 名称
  • PSDrive 名称
  • 范围修饰符

特殊情况

  • 模块名称不区分大小写(有例外)

    模块名称纯粹是 PowerShell 概念,不区分大小写。 但是,存在到文件夹名称的强映射,这在基础操作系统中可能区分大小写。 导入具有相同大小写名称的两个模块的行为与从不同路径导入具有相同名称的两个模块具有相同的行为。

    模块名称使用导入时的大小写存储在会话状态中。 查找新的帮助文件时,该名称与存储在会话状态中一样 Update-Help 使用。 为Microsoft提供帮助文件的 Web 服务使用区分大小写的文件系统。 如果导入的模块名称的大小写不匹配,则 Update-Help 找不到帮助文件,会报告错误。

  • PS 提供程序

    FileSystem Windows 系统上的提供程序和 Environment 提供程序区分大小写。 通常,涉及路径或环境变量的作在此类系统上区分大小写。

    但是,无论系统如何,提供程序 cmdlet通配符匹配都是不区分大小写的。

    PS /home/user01> New-Item -Path Temp:foo.txt -Force
    
        Directory: /tmp
    
    UnixMode      User Group      LastWriteTime         Size Name
    --------      ---- -----      -------------         ---- ----
    -rw-r--r--  user01 user01    1/6/2026 10:53            0 foo.txt
    
    PS /home/user01> (Get-Item -Path Temp:FOO.txt).Name
    Get-Item: Cannot find path 'Temp:/FOO.txt' because it does not exist.
    
    PS /home/user01> (Get-Item -Path Temp:F[O]*.txt).Name
    foo.txt
    
    PS /home/user01> (Get-Item -Path Env:hOM[E]).Name
    HOME
    
  • 参数集名称区分大小写。

    大小 DefaultParameterSetName 写必须相同 ParameterSetName

  • 默认情况下,.NET 方法通常表现出区分大小写的行为。

    示例包括:

    • 常见 PowerShell 运算符的等效 .NET 方法(没有显式选择加入),例如:
      • Array.Contains()String.Contains()String.Replace()Regex.Match()Regex.Replace()
    • 反射;成员名称必须使用正确的大小写。
    • 非文本字典实例化。 例如:
      • [hashtable]::new() 具有区分大小写的键,而哈希表文本 @{} 的键不区分大小写。
      • [ordered]::new() 具有区分大小写的键,而 [ordered] @{} 不区分大小写的键。 类型[ordered]加速器在 PowerShell v5.1 及更早版本中不可用。
    • 默认情况下,显式调用 Enum.Parse() 区分大小写,而 PowerShell 通常以不区分大小写的方式处理枚举。
  • -Unique Cmdlet:

  • Compare-Object 默认情况下不区分大小写,但具有开关 -CaseSensitive 。 默认情况下,类型的 [char] 比较区分大小写。 默认情况下,字符串比较不区分大小写。

    # Compare strings - Equal (no output)
    Compare-object -ReferenceObject a            -DifferenceObject A
    # Compare chars - Different (output)
    Compare-object -ReferenceObject ([char] 'a') -DifferenceObject ([char] 'A')
    
  • ConvertFrom-Json -AsHashtable:

  • Group-Object:

    • 默认情况下不区分大小写,但确实有一个 -CaseSensitive 开关。

    • 在 Windows PowerShell v5.1 中, -CaseSensitive 生成 -AsHashtable 不区分大小写的哈希表。 重复键会导致错误。

      [pscustomobject] @{ Foo = 'Bar' }, [pscustomobject] @{ Foo = 'bar' } |
          Group-Object -Property Foo -CaseSensitive -AsHashtable
      
      Group-Object : The objects grouped by this property cannot be expanded
      because there is a key duplication. Provide a valid value for the
      property, and then try again.
      At line:2 char:11
      +           Group-Object -Property Foo -CaseSensitive -AsHashtable
      +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          + CategoryInfo          : InvalidArgument: (:) [Group-Object], Exception
          + FullyQualifiedErrorId : The objects grouped by this property
      cannot be expanded because there is a key duplication. Provide a valid
      value for the property, and then try again.,Microsoft.PowerShell.Comman
      ds.GroupObjectCommand
      
    • 在 PowerShell v7 及更高版本中, -CaseSensitive-AsHashtable 生成区分大小写的哈希表。 重复键不会发生错误。

      [pscustomobject] @{ Foo = 'Bar' }, [pscustomobject] @{ Foo = 'bar' } |
          Group-Object -Property Foo -CaseSensitive -AsHashtable
      
      Name                           Value
      ----                           -----
      Bar                            {@{Foo=Bar}}
      bar                            {@{Foo=bar}}
      
  • Select-String:

    • 默认情况下不区分大小写,但确实有一个 -CaseSensitive 开关。
  • Get-Command 和命令发现/调用:

    • 在区分大小写的文件系统上,发现和调用 ExternalScriptApplication 命令区分大小写。
    • Get-Command 与这些类型的通配符匹配也区分大小写。
    • 所有其他 CommandTypes 都是不区分大小写的。
  • 比较运算符

    • 默认情况下,运算符不区分大小写。

    • -c* 运算符区分大小写。

    • -i* 运算符不区分大小写。

    • -replace / -ireplace默认情况下不区分大小写,命名捕获组除外,区分大小写。

      'Bar' -replace '(?<a>a)', '${a}${a}'
      # Baar
      
      'Bar' -replace '(?<a>a)', '${A}${A}'
      # B${A}${A}r
      
  • -split 运算符

    • -split-isplit 不区分大小写。

    • -csplit区分大小写,除非IgnoreCase指定了选项。

      'Bar' -csplit 'A', 0
      # Bar
      
      'Bar' -csplit 'A', 0, 'IgnoreCase'
      # B
      # r
      
  • Tab 补全

    • 在区分大小写的文件系统上,选项卡完成和浏览都是不区分大小写的。 例如, TabExpansion2 -inputScript ./foo 将在 Linux 上完成 ./Foo.txt
  • using 声明:

    • 在区分大小写的文件系统上, using module 指定 using assembly 路径时区分大小写。
    • using module 只有模块名称不区分大小写。
    • using namespace 始终不区分大小写。
  • 特殊字符

    • 转义序列(如 `n 区分大小写)。

另请参阅