为啥 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
属性,结果我遇到了一个非常奇怪的案例:
有人知道我们为什么会有这种奇怪的行为吗?
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-ItemProperty
和 Set-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.txt
和MyFile.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 比区分大小写的列更快?