Por que usar “Cmd /c Powershell” em vez de apenas “Powershell”?

Por que usar “Cmd /c Powershell” em vez de apenas “Powershell”?

Adicionei meu primeiro menu de contexto usando o registro conforme as instruções fornecidas emessa questão(sim, eu).

Originalmente usei isso como o comando que ele executa, ou seja, o valor da chave "comando":

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

ImageSeqViewé o nome da minha função do PowerShell, eu importo-a no meu perfil do PowerShell. Funciona bem, mas estou me perguntando: por que usar cmdto open Powershellpara executar a função? Não seria mais simples simplesmente fazer

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

Esse comando parece funcionar bem, mas como parece canônico de usar, cmdestou me perguntando: ele está matando filhotes secretamente ou algo assim?

insira a descrição da imagem aqui

Responder1

Não há uma boa razão para fazer isso. Na verdade, o único efeito real que acontece é desacelerar as coisas.

As pessoas podem pensar que há uma boa razão para fazer isso. O uso do CMD tem os seguintes efeitos que geralmente podem ser bons em alguns casos:

  • Habilita comandos internos, como " DIR"
  • Define variáveis ​​de ambiente, como a variável PATH

No entanto, neste caso, nenhum desses benefícios é obtido. Vejamos esses dois cenários:

Portanto, pode haver, em alguns casos, um momento em que usar " CMD /C" seja útil. Por exemplo, se eu usar o comando externo PSEXEC(baixado do SysInternals) e tentar executar " DIR" em um computador remoto, o Windows tentará executar o DIRcomando " ". O Windows não conseguirá executar esse comando porque não há arquivo " DIR.EXE", " DIR.BAT" ou " DIR" terminando com outra extensão suportada. (Extensões suportadas podem ser vistas executando " ECHO %PATHEXT%".)

No entanto, neste cenário, se eu tentar executar " CMD /C DIR", então isso funcionará, porque o Windows irá procurar por um executável chamado " CMD", e irá encontrá-lo, e então CMDterminará executando com sucesso o DIRcomando " " que é um comando interno parte do CMDcomando " ".

Nesse caso, você pode executar powershellcom a mesma facilidade que " CMD /C powershell", para não obter nenhum benefício com o " CMD /C" desnecessário. O único benefício que vejo ao passar pela etapa extra de digitar " CMD /C" é fornecer um exemplo que será útil se alguém decidir tentar modificar um exemplo para executar uma linha de comando " DIR" ou " COPY". Ter um exemplo mais flexível pode ser útil para algumas pessoas. Realmente não é necessário quando as pessoas sabem o que estão fazendo.

Quanto ao segundo ponto que forneci, que é definir variáveis ​​de ambiente, isso também é algo que você não está fazendo ativamente neste caso específico. Talvez algumas pessoas pensem que estão ajudando ao definir a variável de ambiente PATH. No entanto, quando você executa comandos diretamente (por exemplo, na opção de menu “Executar” do menu Iniciar), o sistema operacional Windows pode procurar comandos em alguns locais adicionais. Por exemplo, no Windows XP/mais recente você pode executar:

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

Se o comando que você deseja executar estiver listado em "Caminhos de aplicativos", o Windows poderá encontrar o programa mesmo que ele não esteja no caminho. Portanto, é provável que o Windows encontre ainda MAIS do que o CMD encontraria no PATH que o CMD usa.

Um benefício possível é se você deseja que o CMD seja executado para poder se referir a uma variável de ambiente como %USERPROFILE% ou %LOGONSERVER% ou %TEMP%/%TMP%, mas como você não está fazendo isso, você não está precisando executar " CMD /C".

Portanto, para o seu caso específico: não há um bom motivo para fazer isso. Os efeitos que você está obtendo são fazer com que seu computador trabalhe mais, tornando o processo mais lento e usando mais memória (tudo isso que você está fazendo em quantidades insignificantes em equipamentos modernos).

Responder2

Porque elimina a coloração.

Pode ser que eles pensem que as pessoas acham o fundo azul uma distração.

Responder3

Com cmd powershell, você pede ao shell atual, o explorer, para invocar cmd com parâmetros powershell, "imageSeqView ..."com valor analisado de% 1 para cmd.

Neste caso, "powershell"o cmd espera que seja um comando cmd, um exe ou um dos scripts suportados pelo cmd, por exemplo, bat.

Com powershell "imageSeqView ...", você pede ao shell atual, explorer, para invocar powershellparâmetros imageSeqView ...com valor analisado de% 1 para o powershell.

Nesse caso, " imageSeqView" o PowerShell espera que seja um cmdlet, um exe ou um script do PowerShell.

Desde que " imageSeqView" seja uma função do PowerShell, a 1ª forma é completamente desnecessária e diminui um pouco o desempenho.

Para opções de janela de comando, existem opções semelhantes no PowerShell, como -NoExit, que deve ser igual a /K no cmd.

Para pipe-lining, inicializando env vars, o PowerShell pode fazer o mesmo.

informação relacionada