例如,获取所有网络地址/适配器以便对其应用设置:
Get-NetIPAddress | Set-NetIPAddress -SkipAsSource $true
不过,我需要排除其中一项。这个清单很长,所以最好的办法就是把它挑出来,或多或少地Get-NetIPAddress -ifIndex 39 | Set-NetIPAddress -SkipAsSource…
否定它。
我知道我可以使用if
、Where-Object
或其他任何方式,但重点是要快速完成,就像在 Bash 中只需 即可完成一样!
。这就是为什么我将其表述为否定选项而不是状况。
我试过:
Get-NetIPAddress -ifIndex !39
Get-NetIPAddress -ifIndex -ne 39
Get-NetIPAddress (! -ifIndex 39)
Get-NetIPAddress !(-ifIndex 39)
Get-NetIPAddress -ifIndex not 39
我并不指望它们能起作用,因为其中一些是从其他函数借用的语法(?)。不过,如果你对它能起作用抱有一点希望,你就不会费心输入命令。
谢谢。
答案1
标准 PowerShell 选项解析器没有通用的“否定”语法,因为它是选项解析器,而不是筛选解析器(即使某些选项恰好用于过滤目的,但那是在选项及其值被解析之后很久才发生的)——布尔“标志”选项可以被否定,但“值”选项不能。
(您实际上也无法在“Bash”中执行此操作;find ! -foo
之所以有效,是因为该find
命令专门使用了为此设计的自定义命令行解析器,但这不适用于任何其他程序,当然也不适用于使用通用 getopt_long 解析器的程序--option
。)
cmdlet可以识别!
为选项值的一部分(例如Get-NetIPAddress -ifIndex !39
),但同样,还没有以这种方式进行编程。(它可能要求将 ifIndex 解析为整数。)
答案2
PowerShell 确实接受!
运算符作为运算符的替代语法not
,尽管仅限于布尔表达式的上下文中,因此不带参数。
例如,你可以写:
if (-Not (Test-Path C:\Code)) {
write "it doesn't exist!"
}
但你也可以使用!
这种方式:
if (!(Test-Path C:\Code)) { write "it doesn't exist!" }
用户@ReddyLutonadio 在他的评论中指出了使用最短的语法制定示例命令的各种方法。