start - Arquivos em lote do Windows:.bat vs.cmd?




start command bat (10)

Pelo que entendi, .bat é a antiga convenção de nomenclatura de 16 bits, e .cmd é para o Windows de 32 bits, ou seja, começando com o NT. Mas continuo a ver arquivos .bat em todos os lugares, e eles parecem funcionar exatamente da mesma forma usando o sufixo. Supondo que o meu código nunca precise ser executado em algo mais antigo que o NT, será que realmente importa de que maneira eu nomeio meus arquivos em lote, ou há alguma pegadinha me aguardando usando o sufixo incorreto?


A execução do arquivo .cmd e .bat é diferente porque, em uma variável errorlevel .cmd, ela pode ser alterada em um comando que é afetado pelas extensões de comando. É sobre isso mesmo.


A extensão não faz diferença. Há pequenas diferenças entre Commandman.com manipulando o arquivo versus CMD.EXE


Ainda assim, no Windows 7, os arquivos BAT também têm essa diferença: Se você criar arquivos TEST.BAT e TEST.CMD no mesmo diretório e executar TEST nesse diretório, ele executará o arquivo BAT.

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>

Aqui está uma compilação de informações verificadas das várias respostas e referências citadas neste tópico:

  1. command.com é o processador de comandos de 16 bits introduzido no MS-DOS e também foi usado na série Win9x de sistemas operacionais.
  2. cmd.exe é o processador de comandos de 32 bits no Windows NT (os sistemas operacionais Windows de 64 bits também têm uma versão de 64 bits). cmd.exe nunca fez parte do Windows 9x. Originou-se no OS / 2 versão 1.0, e a versão OS / 2 do cmd começou em 16-bit (mas ainda assim foi um programa em modo protegido de pleno direito com comandos como start ). O Windows NT herdou o cmd do OS / 2, mas a versão Win32 do Windows NT começou com 32 bits. Embora o OS / 2 tenha sido de 32 bits em 1992, seu cmd permaneceu como um programa OS / 2 1.x de 16 bits.
  3. A variável ComSpec env define qual programa é iniciado pelos scripts .bat e .cmd . (Começando com o WinNT, o padrão é o cmd.exe .)
  4. cmd.exe é compatível com o command.com .
  5. Um script projetado para o cmd.exe pode ser denominado .cmd para impedir a execução acidental no Windows 9x. Esta extensão de nome de arquivo também remonta ao OS / 2 versão 1.0 e 1987.

Aqui está uma lista de recursos do cmd.exe que não são suportados pelo command.com :

  • Nomes de arquivos longos (excedendo o formato 8.3)
  • Histórico de comando
  • Conclusão de tabulação
  • Caractere de escape: ^ (Use para: \ & | > < ^ )
  • Pilha de diretórios: PUSHD / POPD
  • Aritmética inteira: SET /A i+=1
  • Pesquisar / Substituir / Substring: SET %varname:expression%
  • Substituição de comando: FOR /F (existia antes, foi aprimorada)
  • Funções: CALL :label

Ordem de Execução:

Se as versões .bat e .cmd de um script (test.bat, test.cmd) estiverem na mesma pasta e você executar o script sem a extensão (teste), por padrão, a versão .bat do script será executada, mesmo no Windows 7 de 64 bits. A ordem de execução é controlada pela variável de ambiente PATHEXT. Consulte Ordem na qual o prompt de comando executa arquivos para obter mais detalhes.

Referências:

wikipedia: Comparação de shells de comando


Como o post original era sobre as conseqüências do uso do sufixo .bat ou .cmd, não necessariamente os comandos dentro do arquivo ...

Uma outra diferença entre .bat e .cmd é que, se dois arquivos existirem com o mesmo nome de arquivo e ambas as extensões, então:

  • digitar nome do arquivo ou nome do arquivo .bat na linha de comando executará o arquivo .bat

  • para executar o arquivo .cmd, você precisa digitar filename .cmd


Essas respostas são um pouco longas demais e focadas no uso interativo. As diferenças importantes para o script são:

  • .cmd impede a execução inadvertida em sistemas não-NT.
  • .cmd permite comandos internos para alterar o Errorlevel para 0 em caso de sucesso.

As extensões de comando estão ativadas por padrão nos arquivos .bat e .cmd no Windows 2000 ou posterior.

Em 2012 e além, recomendo usar o .cmd exclusivamente.


Não - não importa nem um pouco. No NT, as extensões .bat e .cmd fazem com que o processador cmd.exe processe o arquivo exatamente da mesma maneira.

Informações adicionais interessantes sobre o comando vs cmd.exe em sistemas de classe WinNT da MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):

Esse comportamento revela um recurso bastante sutil do Windows NT que é muito importante. O shell do MS-DOS de 16 bits (Command.com) que vem com o Windows NT é especialmente projetado para o Windows NT. Quando um comando é inserido para execução por este shell, ele não o executa de fato. Em vez disso, ele empacota o texto do comando e o envia para um shell de comando CMD.EXE de 32 bits para execução. Como todos os comandos são realmente executados pelo CMD.EXE (o shell de comando do Windows NT), o shell de 16 bits herda todos os recursos e recursos do shell completo do Windows NT.


tudo funcionando em um lote deve funcionar em um cmd; O cmd fornece algumas extensões para controlar o ambiente. Além disso, o cmd é executado no novo interpretador de cmd e, portanto, deve ser mais rápido (não perceptível em arquivos curtos) e mais estável, à medida que o morcego é executado no ambiente de 16 bits emulado do NTVDM.


Desta postagem do grupo de notícias do próprio Mark Zbikowski :

As diferenças entre .CMD e .BAT, no que diz respeito ao CMD.EXE, são: Com as extensões ativadas, os arquivos PATH / APPEND / PROMPT / SET / ASSOC em .CMD definem ERRORLEVEL, independentemente do erro. .BAT define ERRORLEVEL somente em erros.

Em outras palavras, se ERRORLEVEL estiver definido como non-0 e você executar um desses comandos, o ERRORLEVEL resultante será:

  • deixado sozinho em seu valor não-0 em um arquivo .bat
  • redefinir para 0 em um arquivo .cmd.

RE: Aparentemente quando command.com é invocado é um mistério complexo;

Vários meses atrás, durante o curso de um projeto, tivemos que descobrir por que alguns programas que queríamos executar sob o CMD.EXE estavam, de fato, sendo executados no COMMAND.COM. O "programa" em questão era um arquivo .BAT muito antigo, que ainda roda diariamente.

Descobrimos que o motivo pelo qual o arquivo em lote executado no COMMAND.COM é que ele estava sendo iniciado a partir de um arquivo .PIF (também antigo). Como as configurações especiais de memória disponíveis apenas através de um PIF se tornaram irrelevantes, nós as substituímos por um atalho convencional na área de trabalho.

O mesmo arquivo em lotes, iniciado a partir do atalho, é executado no CMD.EXE. Quando você pensa sobre isso, isso faz sentido. A razão pela qual levamos tanto tempo para descobrir isso foi em parte devido ao fato de termos esquecido que seu item no grupo de inicialização era um PIF, porque estava em produção desde 1998.





cmd