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

25

Eu adicionei meu primeiro menu de contexto usando o registro conforme as instruções fornecidas nesta pergunta (yay me).

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, importo-a no meu perfil do PowerShell. Funciona bem, mas estou me perguntando: por que usar cmdpara abrir Powershellpara executar a função? Não seria mais simples fazer

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

Esse comando parece funcionar muito bem, mas, como parece canônico, cmdpergunto-me se está matando secretamente filhotes ou algo assim?

insira a descrição da imagem aqui

stib
fonte
2
Nenhuma das respostas da pergunta vinculada é usada cmd /c... cmd /ké bastante diferente, pois deixa a janela aberta após a conclusão do comando. Presumivelmente, o solicitante fez dessa maneira para que eles pudessem ver a saída para fins de depuração.
Bob
1
Não é tanto o modificador que estou pensando, é o uso de cmdtodos, o que parece onipresente em minha pesquisa.
Stib
Você pode fornecer uma referência que realmente recomende cmd /c powershellespecificamente? Novamente, o que você vinculou não faz essa recomendação.
Bob
3
Em um palpite, provavelmente é principalmente o cultivo de carga. Existem alguns casos em que isso pode ser desejado (ou seja, quando você deseja usar construções de cmd como tubulação), mas elas não se aplicam quando você pode fazer o mesmo no PowerShell de qualquer maneira. Não há nada na documentação do MSDN que sugira que isso seja necessário, embora os documentos que cercam as associações de arquivos sejam bastante esparsos.
Bob

Respostas:

29

Não há uma boa razão para fazer isso. De fato, 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:

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

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

Portanto, em alguns casos, pode haver um tempo em que usar " CMD /C" é ú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 falhará ao executar esse comando, pois não há arquivo " DIR.EXE", " DIR.BAT" ou " DIR" que termine com outra extensão suportada. (As extensões suportadas podem ser vistas executando " ECHO %PATHEXT%".)

No entanto, nesse cenário, se eu tentar executar " CMD /C DIR", isso funcionará, porque o Windows procurará um executável chamado " CMD" e descobrirá isso, e CMDacabará executando com êxito o DIRcomando " " que é interno parte do CMDcomando " ".

Nesse caso, você pode executar powershelltão facilmente quanto " CMD /C powershell", para que você não se beneficie do desnecessário " CMD /C". O único benefício que estou vendo na etapa extra de digitar " CMD /C" é fornecer um exemplo que será útil se alguém decidir 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 as coisas, fazendo com que a variável de ambiente PATH seja definida. 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 do aplicativo", o Windows poderá encontrar o programa mesmo que não esteja no caminho. Portanto, é provável que o Windows encontre MUITO MAIS do que o que o CMD encontraria no PATH que o CMD usa.

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

Portanto, para o seu caso em particular: não há uma boa razão para fazê-lo. Os efeitos que você está conseguindo são fazer com que seu computador faça mais trabalho, diminuindo a velocidade do processo e usando mais memória (tudo o que você está fazendo em quantidades insignificantes em equipamentos modernos).

TOOGAM
fonte
Estou totalmente de acordo com os conselhos que Bob estava dando. Bob estava levando você no caminho certo. Enquanto lia as coisas, pensei que mais algumas informações poderiam ajudar a fornecer um pouco mais de clareza rapidamente.
TOOGAM
2
ftr - iniciar um processo com uma prioridade diferente é um bom caso de uso cmd /c. Algo como cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Boa resposta. Uma coisa que eu mencionaria é que isso também executa a execução automática do cmd , mas isso geralmente não está definido, e mesmo quando está definido, provavelmente não é desejado em uma associação de arquivos. E Lieven faz um bom argumento com a prioridade, embora, novamente, eu ache isso um pouco estranho para uma associação de arquivos.
Bob
1
O próprio cmd não define variáveis ​​de ambiente. O ambiente é herdado do processo pai, adicionando o cmd no meio não muda nada sobre isso. O App Paths é usado apenas para ShellExecute, tanto quanto eu sei, não para CreateProcess; portanto, na maioria das circunstâncias (especialmente em shells), essas não se aplicam (você pode tentar você mesmo, pbrushé um App Path mspainte não funcionará no muitos lugares).
Joey
@ Joey talvez seja mais correto dizer que expande as variáveis ​​... mas, pensando bem, se você usar, REG_EXPAND_SZpoderá expandir variáveis ​​de ambiente (usando o mesmo %syntax%) sem chamar o cmd. Os verbos usados ​​nas associações de arquivos são chamados via ShellExecuteEx, portanto, os Caminhos de Aplicativo se aplicam aqui.
Bob
18

Porque se livra da coloração.

Pode ser que eles achem que as pessoas acham o fundo azul perturbador.

Mehrdad
fonte
1
Você não tem o Windows à mão, mas não pode simplesmente definir a cor de fundo nas propriedades do console?
Ruslan
1
Voto positivo, apesar de ser uma resposta competitiva para a minha, o que sugere que não há uma razão. Porque, esta é uma razão sensata. Bom trabalho. Obviamente, algumas pessoas podem achar que a caixa preta é mais perturbadora do que a caixa azul. No entanto, isso é uma questão de preferência e as pessoas podem ter preferências diferentes, então marque +1 para obter uma resposta boa e precisa. @ Russia: Sim, mas você consegue fazer essa alteração antes que um programa rápido desapareça? (E, você sabe se as alterações feitas a uma sessão afetará outras sessões configurações diferentes entre os casos gerais e as específicas, como ícones do desktop.?)
TOOGAM
Eu nunca noto isso porque uso o conEmu como meu console padrão, o que significa que sempre recebo minha janela do console bem configurada (com arte ascii e prompts personalizados e gifs de tochas acesas. Carrega em menos de 10 minutos também!)
stib
1

Com cmd powershell, você solicita ao shell atual, explorer, que invoque o cmd com parâmetros powershell, "imageSeqView ..."com valor analisado de% 1 a cmd.

Nesse caso, "powershell"espera-se que o cmd seja um comando do cmd, um exe ou um dos scripts suportados do cmd, por exemplo, bat.

Com powershell "imageSeqView ...", você solicita ao shell atual, explorer, que invoque powershellcom parâmetros imageSeqView ...com valor analisado% 1 para o PowerShell.

Nesse caso, " imageSeqView" espera-se que o powershell seja um script de cmdlet, exe ou powershell.

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

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

Para revestimento de tubos, inicializando env vars, o PowerShell pode fazer o mesmo.

chingNotCHing
fonte