如何在PowerShell中取消条件?


272

如何在PowerShell中取消条件测试?

例如,如果要检查目录C:\ Code,则可以运行:

if (Test-Path C:\Code){
  write "it exists!"
}

有否否定该条件的方法,例如(无效):

if (Not (Test-Path C:\Code)){
  write "it doesn't exist!"
}

解决方法

if (Test-Path C:\Code){
}
else {
  write "it doesn't exist"
}

这工作正常,但我更喜欢内联。

Answers:


508

您几乎拥有了它Not。它应该是:

if (-Not (Test-Path C:\Code)) {
    write "it doesn't exist!"
} 

您也可以使用!if (!(Test-Path C:\Code)){}

只是为了好玩,您也可以使用按位异或,尽管它不是最易读/可理解的方法。

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}

2
有趣,那么-not带有传统的替代品!呢?我能以某种方式获得了传统的替代品-eq-ne吗?
罗曼·斯塔科夫

8
不,-not是唯一的逻辑运算符,它带有一个替代项(请参阅help about_Logical_Operators参考资料),并且运算符不能为别名。
雷纳特2012年

14
谢谢,我缺少使用!必需括号的事实。
整体开发人员

@ Holistic-Developer !本身不需要括号。至少在PS3中没有。
Llyle

9
未将术语“!Test-Path”识别为cmdlet的名称... :)
sodawillow

9

如果您像我一样并且不喜欢双括号,则可以使用一个函数

function not ($cm, $pm) {
  if (& $cm $pm) {0} else {1}
}

if (not Test-Path C:\Code) {'it does not exist!'}


1
我喜欢这个,但可能无法not在任何地方使用此实现(例如,not Test-Path -path C:\Code将无法使用)。另请参阅此相关文章
orad 2015年

2
在Vulcan的意义上,Perl具有更合乎逻辑的习惯用法,称为“除非”,它被编写为函数。作为Vulcan的一半,我更喜欢它,并且已经在C#中将其实现为函数,在C和C ++中将其实现为宏。
戴维·格雷

1
@ DavidA.Gray Ruby具有unlessas关键字(就像一样if),但是其他语言的大多数用户都讨厌它。
富兰克林·于

3

Powershell还接受C / C ++ / C *不是运算符

if(!(Test-Path C:\ Code)){写“它不存在!” }

我经常使用它,因为我习惯于C * ...
允许代码压缩/简化...
我也觉得它更优雅...


0

如果您不喜欢双括号,或者不想编写函数,则可以使用变量。

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.