Pourquoi utiliser «Cmd / c Powershell» au lieu de simplement «Powershell»?

25

J'ai ajouté mon premier menu contextuel en utilisant le registre selon les instructions données dans cette question (ouais moi).

Je l'ai utilisé à l'origine comme la commande qu'il exécute, c'est-à-dire la valeur de la touche "commande":

Cmd /C Powershell  "imageSeqView --% \"%1\""

ImageSeqViewest le nom de ma fonction powershell, je l'importe dans mon profil powershell. Cela fonctionne bien, mais je me demande: pourquoi utiliser cmdpour ouvrir Powershellpour exécuter la fonction? Ne serait-il pas plus simple de le faire

Powershell  "imageSeqView --% \"%1\""

Cette commande semble fonctionner très bien, mais comme elle semble canonique à utiliser, cmdje me demande si elle tue secrètement des chiots ou quelque chose?

entrez la description de l'image ici

stib
la source
2
Aucune des réponses de la question liée n'utilise cmd /c... cmd /kest assez différente en ce qu'elle laisse la fenêtre ouverte une fois la commande terminée. Vraisemblablement, le demandeur l'a fait de cette façon afin qu'ils puissent voir la sortie à des fins de débogage.
Bob
1
Ce n'est pas tant le modificateur que je me demande, c'est l'utilisation du cmdtout, qui semble être omniprésent dans mes recherches.
stib
Pouvez-vous fournir une référence qui recommande réellement cmd /c powershellspécifiquement? Encore une fois, celui que vous avez lié ne fait pas une telle recommandation.
Bob
3
À une supposition, c'est probablement principalement la culture de cargaison. Il y a quelques cas où cela peut être souhaité (à savoir, lorsque vous souhaitez utiliser des constructions cmd comme des tuyaux), mais elles ne s'appliquent pas vraiment lorsque vous pouvez faire la même chose dans PowerShell de toute façon. Il n'y a rien dans la documentation MSDN qui suggère que cela soit nécessaire, bien que les documents entourant les associations de fichiers soient plutôt rares.
Bob

Réponses:

29

Il n'y a aucune bonne raison de le faire. En fait, le seul effet réel qui se produit est de ralentir les choses.

Les gens pourraient penser qu'il y a une bonne raison de le faire. L'utilisation de CMD a les effets suivants qui peuvent généralement être bons dans certains cas:

  • Active les commandes internes, comme " DIR"
  • Définit les variables d'environnement, telles que la variable PATH

Cependant, dans ce cas, aucun de ces avantages n'est obtenu. Examinons ces deux scénarios:

Ainsi, dans certains cas, il peut y avoir un moment où l'utilisation de " CMD /C" est utile. Par exemple, si j'utilise la commande externe PSEXEC(téléchargée depuis SysInternals) et que j'essaie d'exécuter " DIR" sur un ordinateur distant, Windows essaiera d'exécuter la DIRcommande " ". Windows ne pourra pas exécuter cette commande car il n'existe aucun fichier " DIR.EXE", " DIR.BAT" ou " DIR" se terminant par une autre extension prise en charge. (Les extensions prises en charge sont visibles en exécutant " ECHO %PATHEXT%".)

Cependant, dans ce scénario, si j'essaie d'exécuter " CMD /C DIR", cela fonctionnera, car Windows recherchera un exécutable nommé " CMD", le trouvera et CMDfinira par exécuter avec succès la DIRcommande " " qui est une commande interne. partie de la CMDcommande " ".

Dans ce cas, vous pouvez simplement exécuter powershellaussi facilement que " CMD /C powershell", afin de ne tirer aucun avantage de l'inutile " CMD /C". Le seul avantage que je vois à passer par l'étape supplémentaire de taper " CMD /C" est de fournir un exemple qui sera utile si quelqu'un décide d'essayer de modifier un exemple pour exécuter une ligne de commande " DIR" ou " COPY". Avoir un exemple plus flexible peut être utile pour certaines personnes. Ce n'est vraiment pas nécessaire lorsque les gens savent ce qu'ils font.

Quant au deuxième point que j'ai fourni, qui est de définir des variables d'environnement, c'est aussi quelque chose que vous ne faites pas activement dans ce cas particulier. Peut-être que certaines personnes pensent qu'elles aident les choses en provoquant la définition de la variable d'environnement PATH. Toutefois, lorsque vous exécutez des commandes directement (par exemple, à partir de l'option de menu "Exécuter" du menu Démarrer), le système d'exploitation Windows peut rechercher des commandes à certains endroits supplémentaires. Par exemple, dans Windows XP / plus récent, vous pouvez exécuter:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"

Si la commande que vous souhaitez exécuter est répertoriée sous "Chemins d'application", Windows peut trouver le programme même s'il n'est pas dans le chemin d'accès. Ainsi, Windows est susceptible de trouver encore PLUS que ce que CMD trouverait dans le CHEMIN que CMD utilise.

Un avantage possible est que vous vouliez que CMD soit exécuté afin que vous puissiez vous référer à une variable d'environnement comme% USERPROFILE% ou% LOGONSERVER% ou% TEMP% /% TMP%, mais puisque vous ne le faites pas, vous n'êtes pas besoin d'exécuter " CMD /C".

Donc, pour votre cas particulier: il n'y a aucune bonne raison de le faire. Les effets que vous obtenez sont de faire travailler plus votre ordinateur, de ralentir le processus et d'utiliser plus de mémoire (ce que vous faites en quantité négligeable sur un équipement moderne).

TOOGAM
la source
Je suis entièrement d'accord avec les conseils que Bob a donnés. Bob vous menait sur la bonne voie. Cependant, en lisant les choses, j'ai pensé que plus d'informations pourraient aider à clarifier un peu plus rapidement.
TOOGAM
2
ftr - démarrer un processus avec une priorité différente est un bon cas d'utilisation pour cmd /c. Quelque chose comme cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Bonne réponse. Une chose que j'aurais mentionné est que cela exécute également l'exécution automatique de cmd , mais ce n'est généralement pas défini, et même lorsqu'il est défini, il n'est probablement pas souhaité dans une association de fichiers. Et Lieven fait un bon point avec la priorité, mais encore une fois, je pense que c'est un peu étrange pour une association de fichiers.
Bob
1
cmd lui-même ne définit pas de variables d'environnement. L'environnement est hérité du processus parent, l'ajout de cmd entre les deux ne change rien à cela. Les chemins d'application ne sont utilisés que pour ShellExecute, pour autant que je sache, pas pour CreateProcess, donc dans la plupart des cas (en particulier dans les shells), ceux-ci ne s'appliqueront pas (vous pouvez l'essayer vous-même, pbrushc'est un chemin d'application pour mspaintet ne fonctionnera pas dans plusieurs places).
Joey
@Joey peut-être plus correct de dire qu'il étend les variables ... mais, pensez-y, si vous utilisez, REG_EXPAND_SZvous pouvez étendre les variables d'environnement (en utilisant les mêmes %syntax%) sans appeler cmd. Les verbes utilisés dans les associations de fichiers sont invoqués via ShellExecuteEx, donc les chemins d'application s'appliquent ici.
Bob
18

Parce qu'il se débarrasse de la coloration.

Il se peut qu'ils pensent que les gens trouvent le fond bleu distrayant.

Mehrdad
la source
1
Vous n'avez pas Windows à portée de main, mais ne pouvez-vous pas simplement définir la couleur d'arrière-plan dans les propriétés de la console?
Ruslan
1
Voter, bien qu'il s'agisse d'une réponse concurrente à la mienne, ce qui suggère qu'il n'y a pas de raison. Parce que c'est une raison raisonnable. Bon travail. Bien sûr, certaines personnes peuvent trouver la boîte noire plus distrayante que la boîte bleue. Cependant, c'est une question de préférence et les gens peuvent avoir des préférences différentes, donc +1 pour une bonne et précise réponse. @Rusland: Oui, mais pouvez-vous réussir à faire ce changement avant la disparition d'un programme rapide? (Et, savez-vous si les modifications apportées à une session affecteront les autres sessions. Les paramètres différeront-ils entre les cas généraux et les cas spécifiques comme les icônes du bureau?)
TOOGAM
Je ne le remarque jamais parce que j'utilise conEmu comme console par défaut, ce qui signifie que je reçois toujours ma fenêtre de console bien configurée (avec de l'art ascii et des invites personnalisées et des gifs de torches allumées. Charge en moins de 10 minutes aussi!)
stib
1

Avec cmd powershell, vous demandez au shell actuel, l'explorateur, d'appeler cmd avec des paramètres powershell, "imageSeqView ..."avec une valeur analysée de% 1 à cmd.

Dans ce cas, "powershell"cmd est censé être une commande cmd, un exe ou l'un des scripts pris en charge par cmd, par exemple bat.

Avec powershell "imageSeqView ...", vous demandez au shell actuel, l'explorateur, d'appeler powershellavec des paramètres imageSeqView ...avec une valeur analysée de% 1 à PowerShell.

Dans ce cas, " imageSeqView" est prévu par powershell comme une applet de commande, un exe ou un script powershell.

À condition que " imageSeqView" soit une fonction PowerShell, la 1ère voie est complètement inutile et diminue légèrement les performances.

Pour les options de la fenêtre de commande, il existe des options similaires dans PowerShell telles que -NoExit, qui devrait être identique à / K dans cmd.

Pour le revêtement de tuyaux, l'initialisation des vars env, PowerShell peut faire de même.

chingNotCHing
la source