6
votes

Comment retourner une jolie valeur zéro avec la propriété Count de Get-Process?

Comparez les trois scripts ci-dessous:

SAMLE 1 STRT> P>

GPS AcroRd32 | Measure | Select -Expand Count

# 0 (zero) is returned, but with an ugly Error


0 commentaires

3 Réponses :


2
votes

Je vous suggérerais de faire quelque chose comme ceci:

$acrobat = gps AcroRd32 -ErrorAction SilentlyContinue
if($acrobat){

    write-host "Adobe Reader is On"

} else{

    write-host "Adobe Reader is Off"

}


0 commentaires

9
votes

Ceci est un PowerShell Common Gotcha. Une commande peut revenir:

  • Nothing ~ NULL (n'a pas la propriété compte , que ce soit soit nul ou échoue)
  • Un seul objet (il peut avoir sa propre propriété compter propriété, le cas le plus déroutant - peut retourner n'importe quoi; ou peut ne pas l'avoir, puis obtenir compte obtient nul ou échoue)
  • Tableau d'objet 2+ qui a la propriété compte .

    La solution est simple. Lorsque vous avez vraiment besoin du nombre d'objets retournés, utilisez l'opérateur @ () . Le résultat est toujours un tableau qui a la propriété comptage . xxx


5 commentaires

L'opérateur @ () Association avec le premier affectation de la variable initiale de l'échantillon le rend jolie et fonctionnelle - $ a = @ (GPS | où {$ _ . Par souci de satisfaire à une envie de Pedantic, je dois demander: l'effort d'esthétique (tuyau de GPS à ) entraîne une dégradation des performances par rapport à la comparaison de $ A = @ (GPS ACRORD32) ? Si c'est le faisait, je me rendrais compte que ce serait minuscule et passer inaperçu par nous, mais je veux toujours savoir pour que je puisse me faire un peu moins ignorant XD


J'ai mesuré cela pour un processus "loin": @ (get-processus loin) ~ 1,6 msec. @ (Get-Process | Où {$ _. ProcessName -EQ 'loin'}) ~ 6.8 msec. De mon expérience où-objet et foreach-objet sont essentiellement très lents, je les évite dans des scripts (en v2.0 c'est toujours possible). Mais ils sont toujours utiles dans la ligne de commande sur la typage.


BTW, si vous allez avec @ (GPS ACRORD32) , puis être prêt pour les erreurs lorsque le processus n'existe pas. Avec des erreurs, il sera lent ou peut échouer si la préférence d'erreur est stop . Pour éviter les erreurs, vous pouvez utiliser cette astuce: Stackoverflow.com/questions/4362275/... . Ensuite, @ (GPS [A] CRORD32) devrait être le meilleur pour la performance.


Fascinant Wildcard Work-autour! Quelles ressources devrais-je examiner pour vous familiariser avec toutes ces idiosyncrasies de PowerShell?


Ce site est définitivement l'une des meilleures ressources avec une bonne recherche, aussi: par exemple. Type [PowerShell] , Recherche, Trier par votes, Profitez: Stackoverflow.com/ Questions / Tagged / ...



1
votes

Vous mentionnez l'erreur dans le troisième exemple - vous pouvez masquer le message à l'aide de l'erreur en silenceContinue:

GPS -ea silentlycontinue AcroRd32 | Measure | Select -Expand Count


0 commentaires