How do I negate a conditional test in PowerShell?
For example, if I want to check for the directory C:\Code, I can run:
if (Test-Path C:\Code){
write "it exists!"
}
Is there a way to negate that condition, e.g. (non-working):
if (Not (Test-Path C:\Code)){
write "it doesn't exist!"
}
Workaround:
if (Test-Path C:\Code){
}
else {
write "it doesn't exist"
}
This works fine, but I'd prefer something inline.
You almost had it with Not
. It should be:
if (-Not (Test-Path C:\Code)) {
write "it doesn't exist!"
}
You can also use !
: if (!(Test-Path C:\Code)){}
Just for fun, you could also use bitwise exclusive or, though it's not the most readable/understandable method.
if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}
If you are like me and dislike the double parenthesis, you can use a function
function not ($cm, $pm) {
if (& $cm $pm) {0} else {1}
}
if (not Test-Path C:\Code) {'it does not exist!'}
not
implementation everywhere (for example not Test-Path -path C:\Code
won't work). See also this related post.
unless
as keyword (just like if
) but most user from other languages hate it.
Powershell also accept the C/C++/C* not operator
if ( !(Test-Path C:\Code) ){ write "it doesn't exist!" }
I use it often because I'm used to C*... allows code compression/simplification... I also find it more elegant...
if you don't like the double brackets or you don't want to write a function, you can just use a variable.
$path = Test-Path C:\Code
if (!$path) {
write "it doesn't exist!"
}
Success story sharing
-not
comes with the traditional alternative of!
then? Can I somehow get the traditional alternatives for-eq
and-ne
too?-not
is the only logical operator that comes with an alternate (seehelp about_Logical_Operators
), and operators cannot be aliased.!
required parentheses.Get-ChildItem -r -inc *.txt | !Test-Path