¿Por qué usar "Cmd / c Powershell" en lugar de solo "Powershell"?

25

Agregué mi primer menú contextual usando el registro según las instrucciones dadas en esta pregunta (sí, yo).

Originalmente utilicé esto como el comando que ejecuta, es decir, el valor de la tecla "comando":

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

ImageSeqViewes el nombre de mi función de PowerShell, lo importo en mi perfil de PowerShell. Funciona bien, pero me pregunto: ¿por qué usar cmdpara abrir Powershellpara ejecutar la función? ¿No sería más simple simplemente hacer

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

Ese comando parece funcionar bien, pero dado que parece canónico de usar cmd, me pregunto si está matando secretamente cachorros o algo así.

ingrese la descripción de la imagen aquí

stib
fuente
2
Ninguna de las respuestas en el uso de la pregunta vinculada cmd /c... cmd /kes bastante diferente, ya que deja la ventana abierta después de que se completa el comando. Presumiblemente, el autor de la pregunta lo hizo de esa manera para que pudieran ver la salida con fines de depuración.
Bob
1
No es tanto el modificador por el que me pregunto, sino el uso cmdque hace, lo que parece ser omnipresente en mi investigación.
stib
¿Puede proporcionar una referencia que realmente recomiende cmd /c powershellespecíficamente? Nuevamente, el que vinculó no hace tal recomendación.
Bob
3
Supongo que probablemente sea principalmente de carga de culto. Hay algunos casos en los que esto podría desearse (es decir, cuando desea usar construcciones cmd como tuberías), pero en realidad no se aplican cuando puede hacer lo mismo en PowerShell de todos modos. No hay nada en la documentación de MSDN que sugiera que esto sea necesario, aunque los documentos que rodean las asociaciones de archivos son bastante escasos.
Bob

Respuestas:

29

No hay una buena razón para hacer esto. De hecho, el único efecto real que ocurre es ralentizar las cosas.

La gente podría pensar que hay una buena razón para hacer esto. El uso de CMD tiene los siguientes efectos que comúnmente pueden ser buenos en algunos casos:

  • Habilita comandos internos, como " DIR"
  • Establece variables de entorno, como la variable PATH

Sin embargo, en este caso, ninguno de esos beneficios se obtiene. Echemos un vistazo a estos dos escenarios:

Por lo tanto, puede haber, en algunos casos, un momento en que usar " CMD /C" sea útil. Por ejemplo, si uso el comando externo PSEXEC(descargado de SysInternals) e intento ejecutar " DIR" en una computadora remota, Windows intentará ejecutar el DIRcomando " ". Windows no podrá ejecutar ese comando ya que no hay un archivo " DIR.EXE", " DIR.BAT" o " DIR" que termine con otra extensión compatible. (Las extensiones compatibles se pueden ver ejecutando " ECHO %PATHEXT%".)

Sin embargo, en este escenario, si intento ejecutar " CMD /C DIR", eso funcionará, porque Windows buscará un ejecutable llamado " CMD", y lo encontrará, y luego CMDterminará ejecutando con éxito el DIRcomando " " que es un comando interno parte del CMDcomando " ".

En este caso, puede ejecutarlo powershelltan fácilmente como " CMD /C powershell", por lo que no obtendrá ningún beneficio de lo innecesario " CMD /C". El único beneficio que estoy viendo al pasar por el paso adicional de escribir " CMD /C" es proporcionar un ejemplo que será útil si alguien decide intentar modificar un ejemplo para ejecutar una línea de comando " DIR" o " COPY". Tener un ejemplo más flexible puede ser útil para algunas personas. Realmente no es necesario cuando las personas saben lo que están haciendo.

En cuanto al segundo punto que proporcioné, que es establecer variables de entorno, eso también es algo que no está haciendo activamente en este caso particular. Tal vez algunas personas piensan que están ayudando al hacer que se establezca la variable de entorno PATH. Sin embargo, cuando ejecuta comandos directamente (por ejemplo, desde la opción de menú "Ejecutar" del menú Inicio), el sistema operativo Windows puede buscar comandos en algunos lugares adicionales. Por ejemplo, en Windows XP / más reciente puede ejecutar:

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

Si el comando que desea ejecutar aparece en "Rutas de aplicación", Windows puede encontrar el programa incluso si no está en la ruta. Por lo tanto, es probable que Windows encuentre incluso MÁS que solo lo que CMD encontraría en la RUTA que utiliza CMD.

Un beneficio posible es si desea que se ejecute CMD para que pueda referirse a una variable de entorno como% USERPROFILE% o% LOGONSERVER% o% TEMP% /% TMP%, pero como no está haciendo eso, no está necesitando correr " CMD /C".

Entonces, para su caso particular: no hay una buena razón para hacerlo. Los efectos que está logrando son que su computadora haga más trabajo, ralentice el proceso y use más memoria (todo lo que está haciendo con cantidades insignificantes en los equipos modernos).

TOOGAM
fuente
Estoy totalmente de acuerdo con el consejo que Bob estaba dando. Bob te estaba guiando por el camino correcto. Sin embargo, mientras leía las cosas, pensé que un poco más de información podría ayudar a proporcionar un poco más de claridad rápidamente.
TOOGAM
2
ftr: iniciar un proceso con una prioridad diferente es un buen caso de uso cmd /c. Algo así como cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Buena respuesta. Una cosa que habría mencionado es que esto también ejecuta la ejecución automática de cmd , pero eso generalmente no está configurado, e incluso cuando está configurado probablemente no sea deseado en una asociación de archivos. Y Lieven hace un buen punto con la prioridad, aunque de nuevo creo que es un poco extraño para una asociación de archivos.
Bob
1
cmd en sí mismo no establece variables de entorno. El entorno se hereda del proceso principal, agregar cmd en el medio no cambia nada al respecto. App Paths solo se usa para ShellExecute, por lo que sé, no para CreateProcess, por lo que en la mayoría de las circunstancias (especialmente en shells) no se aplicarán (puede probarlo usted mismo, pbrushes una ruta de aplicación para mspainty no funcionará en muchos lugares).
Joey
@Joey quizás sea más correcto decir que expande las variables ... pero, ahora que lo pienso, si lo usa REG_EXPAND_SZpuede expandir las variables de entorno (usando el mismo %syntax%) sin invocar cmd. Los verbos utilizados en las asociaciones de archivos se invocan a través de ShellExecuteEx, por lo que las rutas de aplicación se aplican aquí.
Bob
18

Porque se deshace de la coloración.

Puede ser que piensen que las personas encuentran que el fondo azul les distrae.

Mehrdad
fuente
1
No tengo Windows a mano, pero ¿no puedes simplemente establecer el color de fondo en las propiedades de la consola?
Ruslan
1
Votación positiva, a pesar de ser una respuesta competitiva a la mía, lo que sugiere que no hay una razón. Porque, esta es una razón sensata. Buen trabajo. Por supuesto, algunas personas pueden encontrar que el cuadro negro distrae más que el cuadro azul. Sin embargo, eso es una cuestión de preferencia y las personas pueden tener preferencias diferentes, por lo que +1 para obtener una respuesta buena y precisa. @ Rusia: Sí, pero ¿puedes lograr que se realice ese cambio antes de que desaparezca un programa rápido? (Y, ¿sabe si los cambios realizados en una sola sesión afectarán a otras sesiones serán diferentes configuraciones entre los casos generales y los específicos como los iconos del escritorio.?)
TOOGAM
Nunca lo noto porque uso conEmu como mi consola predeterminada, lo que significa que siempre obtengo mi ventana de consola bien configurada (con arte ascii y mensajes personalizados y gifs de antorchas encendidas. ¡Carga en menos de 10 minutos también!)
stib
1

Con cmd powershell, le pide al shell actual, explorador, que invoque cmd con parámetros powershell, "imageSeqView ..."con un valor analizado de% 1 a cmd.

En este caso, "powershell"cmd espera que sea un comando cmd, un exe o uno de los scripts compatibles con cmd, por ejemplo, bat.

Con powershell "imageSeqView ...", le pide al shell actual, explorador, que invoque powershellcon parámetros imageSeqView ...con un valor analizado de% 1 a powershell.

En este caso, " imageSeqView" se espera que powershell sea un cmdlet, un exe o un script de powershell.

Siempre que " imageSeqView" sea una función de PowerShell, la primera forma es completamente innecesaria y disminuye ligeramente el rendimiento.

Para las opciones de la ventana de comandos, hay opciones similares en powershell como -NoExit, que debería ser lo mismo que / K en cmd.

Para el revestimiento de tuberías, inicializando entornos, PowerShell puede hacer lo mismo.

chingNotCHing
fuente