为啥 Get-ItemProperty 不区分大小写但 Set-ItemProperty 区分大小写?

Posted

技术标签:

【中文标题】为啥 Get-ItemProperty 不区分大小写但 Set-ItemProperty 区分大小写?【英文标题】:Why Get-ItemProperty is case insensitive but Set-ItemProperty is case sensitive?为什么 Get-ItemProperty 不区分大小写但 Set-ItemProperty 区分大小写? 【发布时间】:2015-05-11 14:09:52 【问题描述】:

我试图通过PowerShell 为我的DefaultAppPool 设置IIS 属性,结果我遇到了一个非常奇怪的案例:

Get-ItemProperty 不区分大小写。 Set-ItemProperty 区分大小写。

有人知道我们为什么会有这种奇怪的行为吗?

PS C:\Windows\system32> Import-Module WebAdministration    
PS C:\Windows\system32> Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.privateMemory

...
Value                       : 27

PS C:\Windows\system32> Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.privateMemory -Value 10

PS C:\Windows\system32> Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.PrIVATeMemory

...
Value                       : 10

PS C:\Windows\system32> Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.PRIvateMemory -Value 15

PS C:\Windows\system32> Get-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.PrivateMemory

...
Value                       : 10 #should be 15 if case insensitive...

【问题讨论】:

据我所知,Get-ItemPropertySet-ItemProperty 使用 provider's 方法。例如,注册表提供程序对两个 cmdlet 都不区分大小写。您必须就该问题联系 IIS 团队,或将其登录到 MS Connect。地狱冻结后,您可能会收到回复……但可能是 WONTFIX。不过,You're not the only one 会注意到这个问题。 不仅仅是区分大小写/不区分大小写,我对同一属性的 Get/Set 之间缺乏一致性感到非常惊讶。我在一个相当长的测试过程结束时发现了这个问题,因为我没想到会出现这种情况......我会提出支持票以了解更多信息。 我的猜测是,由于目标确实是一个 XML 文件,所以它是区分大小写的。 我也遇到过这个问题。奇怪 filter left, format right... Get-Blah 总是会故意撒大网,然后添加过滤器(例如在您的情况下,它实际上是 @987654329 @)。 Set-Blah 通常是相反的,默认情况下,即使是通配符也可能不起作用。也许您的最后一个set-xyz -v 15 实际上是由于属性不存在而出错,我们只是认为它应该使用模糊的过滤器,例如您的get-statement 【参考方案1】:

您有没有注意到,在 Windows 中,如果您仅通过更改文件的大小写来重命名文件,文件实际上并没有改变名称(大小写没有改变)?可能正在进行类似的设计选择。与将myFile.txtMyFile.txt 视为两个独立文件的Linux 不同,Windows 会将它们视为名称冲突。同样,Linux 只会在大小写匹配时自动完成名称,Windows 会自动完成而不考虑大小写。

Windows 可能会转换为全部小写或全部大写以进行比较,然后在写入时使用原始值(并且不写入名称,除非名称更改以提高性能)。因此,当您第一次创建名称时,您可以使用任何您想要的大小写,但是除非名称发生更彻底的更改,否则该大小写会保持不变;但随后任何套管都可用于检索。从本质上讲,它始终不区分大小写,但不会强制名称始终显示为一个大小写,因此它们可以更加用户友好。

【讨论】:

【参考方案2】:

Cmdlet G(S)et-ItemProperty 将工作委托给来自 WebAdministration 模块的 PSProvider(在本例中为 IIS)的方法。这种大小写差异是一个错误的 IIS 方法实现。

IIS PSProvider 充满了这些惊喜

WebAdministration 的替代方案是 IISAdministration 模块,但该模块没有 WebAdministration 模块 100 % 的功能覆盖率。

【讨论】:

这就是为什么每个人都应该尽可能转移到 IISAdministration,docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/…【参考方案3】:

POSH 中的“Get”语句用于数据收集和对象构建/逻辑编排。换句话说,“获取”X 命令永远不会更改具有区分大小写的服务的配置文件(所有管理单元都在那里,谁知道哪个服务具有 POSH 抽象)。 “设置”命令几乎全面用于更改运行它们的系统或系统的配置(或使用 WMI/WinRM 远程)。

【讨论】:

使用格式化工具使您的帖子更具可读性。代码块应类似于 code block。如果需要,请使用 粗体 斜体 按照惯例,这是一个技术上正确的陈述,但没有解释提供者灵活的 cmdlet 的大小写敏感问题。

以上是关于为啥 Get-ItemProperty 不区分大小写但 Set-ItemProperty 区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:为啥不区分大小写的列上的 SELECT 比区分大小写的列更快?

oracle为啥区分大小写?

为啥 cookie 路径区分大小写?

get-itemproperty 报告项目不存在,当它存在时

mysql常用命令区分大小写吗

请问mysql数据类型是不是区分大小写?