2014-05-12 8 views
2

je tentais ajouter au menu contextuel (pour les répertoires) l'option « Ouvrir un projet Sublime » et l'icône du Sublime Text Editor 2.erreur instruction IF

Eh bien, le problème est que si j'exécute les 2 commandes , l'exécution est parfaite, mais si j'exécute le script, seule la première commande est exécutée.

sortie: Aucune erreur

If (-NOT( 
      ([bool](New-Item -Path "HKLM:\Software\Classes\Directory\shell\Open Sublime Project\command" -Value "`"C:\Program Files\Sublime Text 2\sublime_text.exe`" --new-window %1" -Force)) -OR 
      ([bool](New-ItemProperty -Path "HKLM:\Software\Classes\Directory\shell\Open Sublime Project" -Name "Icon" -PropertyType "String" -Value "`"C:\Program Files\Sublime Text 2\sublime_text.exe`",0" -Force)) 
     ) 
    ) 
{ 
    Write-Host "Error" 
} 
Else 
{ 
    Write-Host "No errors" 
} 

Répondre

5

get-help about_Logical_Operators:

Les opérateurs logiques Windows PowerShell évaluer uniquement les instructions nécessaires pour déterminer la valeur de vérité de la déclaration. Si l'opérande gauche dans une instruction qui contient l'opérateur et est FAUX, l'opérande droite n'est pas évaluée. Si l'opérande de gauche dans une instruction qui contient l'instruction or est TRUE, l'opérande de droite n'est pas évalué. Par conséquent, vous pouvez utiliser ces instructions de la même manière que vous utiliseriez l'instruction If pour .

Vous devez séparer l'exécution de l'évaluation logique:

$val1 = New-Item -Path "HKLM:\Software\Classes\Directory\shell\Open Sublime Project\command" -Value "`"C:\Program Files\Sublime Text 2\sublime_text.exe`" --new-window %1" -Force) 
$val2 = New-ItemProperty -Path "HKLM:\Software\Classes\Directory\shell\Open Sublime Project" -Name "Icon" -PropertyType "String" -Value "`"C:\Program Files\Sublime Text 2\sublime_text.exe`",0" -Force 
If (-NOT($val1 -and $val2)) 
{ 
    Write-Host "Error" 
} 
Else 
{ 
    Write-Host "No errors" 
} 

Aussi, je changé -or--and, parce qu'avec ou, si l'on erreurs et l'autre est couronnée de succès, il retournera pas d'erreurs, qui n'a pas de sens pour moi

+0

Je sais utiliser l'instruction if ... De plus, les deux commandes retournent true. – user3602030

+0

Non, la commande one renvoie true, la seconde commande n'est jamais évaluée car la première commande renvoie true. Il n'y a aucune raison d'évaluer les deux côtés du '-or' si le côté gauche est déjà vrai, c'est pourquoi le côté droit n'est jamais exécuté. Il suffit donc de changer le' -or' en un '-and' pour faire votre travail de code, bien qu'il y ait beaucoup de meilleurs moyens de vérifier l'erreur dans powershell. Mais comme mon post lit, si le côté gauche est faux, le côté droit ne fonctionnera jamais dans ce cas – Cole9350

+0

Um ... Mais la première commande (bool) est fausse parce qu'elle est niée:/ – user3602030