简短说明
PowerShell 在保留大小写的同时尽可能不区分大小写。
详细说明
作为一般原则,PowerShell 在保留大小写时不区分大小写,而不是破坏基础 OS。
对于大多数作,基于 Windows 的系统不区分大小写。 但是,对于大多数作,非 Windows 系统区分大小写,尤其是文件系统和环境变量访问。
对于以下方面,PowerShell 保证在所有系统上不区分大小写:
- 变量名称
- 运算符名称
- 非字典成员访问
- PowerShell 命令和别名的命令发现。 这不包括 ExternalScript 和 Application 命令。
- 参数名称和别名
- PowerShell 语言关键字
-
using namespace语句 - 类型文本
-
#Requires语句 - 基于注释的帮助关键字
- PSProvider 名称
- PSDrive 名称
- 范围修饰符
特殊情况
模块名称不区分大小写(有例外)
模块名称纯粹是 PowerShell 概念,不区分大小写。 但是,存在到文件夹名称的强映射,这在基础操作系统中可能区分大小写。 导入具有相同大小写名称的两个模块的行为与从不同路径导入具有相同名称的两个模块具有相同的行为。
模块名称使用导入时的大小写存储在会话状态中。 查找新的帮助文件时,该名称与存储在会话状态中一样
Update-Help使用。 为Microsoft提供帮助文件的 Web 服务使用区分大小写的文件系统。 如果导入的模块名称的大小写不匹配,则Update-Help找不到帮助文件,会报告错误。-
非
FileSystemWindows 系统上的提供程序和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 通常以不区分大小写的方式处理枚举。
- 常见 PowerShell 运算符的等效 .NET 方法(没有显式选择加入),例如:
-UniqueCmdlet:-
Select-Object -Unique并且Get-Unique默认区分大小写。 交换机-CaseInsensitive已添加到 PS v7.4 中。 -
Sort-Object -Unique默认情况下不区分大小写,但始终具有-CaseSensitive开关。
-
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:-
-AsHashtable已在 PS v6 中添加。 在 PS v7.3 中,在指定此参数时,更改了将 JSON 键视为区分大小写。- 使用参数时,会发出一个类型
Management.Automation.OrderedHashtable对象,该对象具有区分大小写的键。 - 如果没有参数,JSON 键将被视为不区分大小写。 输出是自定义对象;最后一个不区分大小写的关键获胜。
- 使用参数时,会发出一个类型
- https://github.com/PowerShell/PowerShell/issues/19928
-
-
默认情况下不区分大小写,但确实有一个
-CaseSensitive开关。在 Windows PowerShell v5.1 中,
-CaseSensitive生成-AsHashtable不区分大小写的哈希表。 重复键会导致错误。[pscustomobject] @{ Foo = 'Bar' }, [pscustomobject] @{ Foo = 'bar' } | Group-Object -Property Foo -CaseSensitive -AsHashtableGroup-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 -AsHashtableName Value ---- ----- Bar {@{Foo=Bar}} bar {@{Foo=bar}}
-
- 默认情况下不区分大小写,但确实有一个
-CaseSensitive开关。
- 默认情况下不区分大小写,但确实有一个
Get-Command和命令发现/调用:- 在区分大小写的文件系统上,发现和调用
ExternalScript和Application命令区分大小写。 -
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且-isplit不区分大小写。-csplit区分大小写,除非IgnoreCase指定了选项。'Bar' -csplit 'A', 0 # Bar 'Bar' -csplit 'A', 0, 'IgnoreCase' # B # r
-
- 在区分大小写的文件系统上,选项卡完成和浏览都是不区分大小写的。 例如,
TabExpansion2 -inputScript ./foo将在 Linux 上完成./Foo.txt。
- 在区分大小写的文件系统上,选项卡完成和浏览都是不区分大小写的。 例如,
using声明:- 在区分大小写的文件系统上,
using module指定using assembly路径时区分大小写。 -
using module只有模块名称不区分大小写。 -
using namespace始终不区分大小写。
- 在区分大小写的文件系统上,
特殊字符:
- 转义序列(如
`n区分大小写)。
- 转义序列(如