Como nego uma condição no PowerShell?

274

Como nego um teste condicional no PowerShell?

Por exemplo, se eu quiser verificar o diretório C: \ Code, posso executar:

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

Existe uma maneira de negar essa condição, por exemplo (não trabalhando):

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

Solução alternativa :

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

Isso funciona bem, mas eu prefiro algo embutido.

Ben McCormack
fonte

Respostas:

508

Você quase teve com isso Not. Deveria ser:

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

Você também pode usar !:if (!(Test-Path C:\Code)){}

Apenas por diversão, você também pode usar o exclusivo bit a bit ou, embora não seja o método mais legível / compreensível.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}
Rynant
fonte
2
Interessante, então -notvem com a alternativa tradicional de !então? Posso de alguma forma obter as alternativas tradicionais para -eqe -netambém?
Roman Starkov
8
Não, -noté o único operador lógico que vem com uma alternativa (consulte help about_Logical_Operators) e os operadores não podem ser aliasados.
Rynant # 7/12
14
Obrigado, estava faltando o fato de que o uso de !parênteses necessários.
Holistic Developer
@ O próprio Holistic-Developer !não requer parênteses. Pelo menos não no PS3.
Llyle
9
O termo '! Test-Path' não é reconhecido como o nome de um cmdlet ... :)
sodawillow
9

Se você é como eu e não gosta do parêntese duplo, pode usar uma função

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

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

Exemplo

Steven Penny
fonte
1
Eu gosto disso, mas provavelmente não pode usar esta notimplementação em qualquer lugar (por exemplo not Test-Path -path C:\Code, não funcionará). Veja também este post relacionado .
orad 13/08/2015
2
O Perl tem um idioma mais lógico, no sentido vulcano, chamado Unless, que é escrito como uma função. Sendo meio vulcano, eu prefiro, e o implementei em C #, como uma função, e em C e C ++, como uma macro.
David A. Gray
1
@ DavidA.Gray Ruby tem unlesscomo palavra-chave (assim como if), mas a maioria dos usuários de outras línguas odeia.
Franklin Yu
3

O PowerShell também aceita o operador C / C ++ / C * não

if (! (Caminho de teste C: \ Código)) {escreva "ele não existe!" }

Uso-o frequentemente porque estou acostumado a C * ...
permite a compactação / simplificação de código ...
Também acho mais elegante ...

ZEE
fonte
0

se você não gosta de colchetes duplos ou não deseja escrever uma função, basta usar uma variável.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Melchior Kannengießer
fonte