Comment annuler une condition dans PowerShell?

274

Comment annuler un test conditionnel dans PowerShell?

Par exemple, si je veux vérifier le répertoire C: \ Code, je peux exécuter:

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

Existe-t-il un moyen de nier cette condition, par exemple (ne fonctionne pas):

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

Solution :

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

Cela fonctionne bien, mais je préférerais quelque chose en ligne.

Ben McCormack
la source

Réponses:

508

Tu l'as presque eu avec Not. Ça devrait être:

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

Vous pouvez également utiliser !:if (!(Test-Path C:\Code)){}

Juste pour le plaisir, vous pouvez également utiliser l'exclusivité au niveau du bit ou, bien que ce ne soit pas la méthode la plus lisible / compréhensible.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}
Rynant
la source
2
Intéressant, -notvient donc l'alternative traditionnelle d' !alors? Puis-je en quelque sorte obtenir les alternatives traditionnelles pour -eqet -neaussi?
Roman Starkov
8
Non, -notest le seul opérateur logique fourni avec un autre (voir help about_Logical_Operators), et les opérateurs ne peuvent pas être aliasés.
Rynant
14
Merci, il me manquait le fait que l'utilisation des !parenthèses requises.
Développeur holistique
@ Holistic-Developer !lui - même ne nécessite pas de parenthèses. Du moins pas sur PS3.
Llyle
9
Le terme '! Test-Path' n'est pas reconnu comme le nom d'une applet de commande ... :)
sodawillow
9

Si vous êtes comme moi et que vous n'aimez pas la double parenthèse, vous pouvez utiliser une fonction

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

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

Exemple

Steven Penny
la source
1
J'aime cela, mais je ne peux probablement pas utiliser cette notimplémentation partout (par exemple not Test-Path -path C:\Code, ne fonctionnera pas). Voir aussi ce lié poste .
orad
2
Perl a un idiome plus logique, au sens vulcain, appelé Unless, qui est écrit comme une fonction. Étant à moitié Vulcain, je le préfère, et l'ai implémenté à la fois en C #, en tant que fonction, et en C et C ++, en tant que macro.
David A. Gray
1
@ DavidA.Gray Ruby a unlesscomme mot-clé (comme if), mais la plupart des utilisateurs d'autres langues le détestent.
Franklin Yu
3

Powershell accepte également l'opérateur C / C ++ / C * not

if (! (Test-Path C: \ Code)) {écrivez "ça n'existe pas!" }

Je l'utilise souvent car j'ai l'habitude du C * ...
permet la compression / simplification du code ...
Je le trouve aussi plus élégant ...

ZEE
la source
0

si vous n'aimez pas les crochets doubles ou si vous ne voulez pas écrire de fonction, vous pouvez simplement utiliser une variable.

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