PowerShell是否支持在全局模式中使用否定语法?

4
在Linux中,Bash支持glob模式中的否定语法,例如[!abc]表示除了abc之外的一个字符。
我正在尝试在PowerShell中找到类似的功能。
支持Cmdlet参数中的通配符字符中,没有关于否定的说明。此外,当存在test.txt时,我确认了以下内容,这表明!不像Bash那样支持否定语法。
  • ls tes[!s].txt不返回任何内容。
  • ls tes[!t].txt返回test.txt
PowerShell是否支持glob模式中的否定语法?如果不支持,你能分享一些替代方法吗?
1个回答

7

不,它不支持此功能(这一点可以从未记录、也无法使用此功能得出结论)。

另一种选择是正则表达式,但是您需要自己进行过滤:

Get-ChildItem | Where-Object Name -match '^tes[^t]\.txt$'

3
另一个选项是 Get-ChildItem 'tes?.txt' | Where-Object { $_.Name -notlike 'tes[qrs].txt' } - Ansgar Wiechers
1
同意;尽可能在左侧进行过滤。 - Bill_Stewart
2
为了更好地解释Ansgar和Bill所说的,通过使用Get-ChildItem过滤器,它告诉提供程序在将结果发送到PowerShell之前对其进行过滤。该提供程序非常高效(毕竟,它只有一个工作),包括过滤结果,因此在这方面比PowerShell快得多。尽可能在提供程序级别进行过滤。 - TheMadTechnician
1
@Joey 这并不完全正确。从v2开始,PowerShell会将任何它可以过滤的内容交给提供程序处理,如果提供程序接受部分过滤(就像FileSystem提供程序一样)。请查看此链接以获取更多信息:https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.provider.containercmdletprovider.convertpath?redirectedfrom=MSDN&view=powershellsdk-1.1.0#System_Management_Automation_Provider_ContainerCmdletProvider_ConvertPath_System_String_System_String_System_String__System_String__ - TheMadTechnician
哦,不错。知道了,我终于可以停止一直使用“-Filter”了 :) - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接