Pelo que entendi, .bat
é a antiga convenção de nomenclatura de 16 bits e .cmd
é para Windows de 32 bits, ou seja, começando com o NT. Mas continuo vendo arquivos .bat em todos os lugares e eles parecem funcionar exatamente da mesma maneira, usando um ou outro sufixo. Assumindo que meu código nunca vai precisar para rodar em qualquer coisa mais velha do que NT, isso realmente importa para que lado eu nomeio meus arquivos em lote, ou se há alguma pegadinha me aguardando usando o sufixo errado?
windows
batch-file
cmd
Chris Noe
fonte
fonte
Respostas:
Deste grupo de notícias publicado pelo próprio Mark Zbikowski :
Em outras palavras, se ERRORLEVEL estiver definido como diferente de 0 e você executar um desses comandos, o ERRORLEVEL resultante será:
fonte
set var=..
instrução. O que é estranho, porque eu assumi que era um comportamento esperado. Argumentos poderiam ser feitos para ambos. Eu vou ficar com os arquivos .bat. :-)DPATH /?
ainda liste o comando como APPEND. Além disso, o artigo do Wiki foi corrigido principalmente, exceto que não lista o DPATH.Aqui está uma compilação de informações verificadas das várias respostas e referências citadas neste tópico:
command.com
é o processador de comando de 16 bits introduzido no MS-DOS e também foi usado na série de sistemas operacionais Win9x.cmd.exe
é o processador de comando 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. Ele se originou no OS / 2 versão 1.0 e a versão do OS / 2cmd
começou em 16 bits (mas ainda assim era um programa em modo protegido de pleno direito com comandos comostart
). Windows NT herdadocmd
do OS / 2, mas a versão Win32 do Windows NT iniciou 32 bits. Embora o OS / 2 tenha 32 bits em 1992, elecmd
permaneceu um programa OS / 2 1.x de 16 bits.ComSpec
variável env define por qual programa é iniciado.bat
e.cmd
scripts. (A partir do WinNT, o padrão écmd.exe
.)cmd.exe
é compatível com versões anteriorescommand.com
.cmd.exe
pode ser nomeado.cmd
para impedir a execução acidental no Windows 9x. Essa extensão de nome de arquivo também remonta ao OS / 2 versão 1.0 e 1987.Aqui está uma lista de
cmd.exe
recursos que não são suportados porcommand.com
:^
(Use para\ & | > < ^
:)PUSHD
/POPD
SET /A i+=1
SET %varname:expression%
FOR /F
(existia antes, foi aprimorada)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 (test), 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
fonte
dir filename
é o mesmo quedir filename.*
em command.com; o curinga é necessário no cmd.exe. No command.comrem Create an empty file > empty.txt
funciona; não no cmd.exe.Essas respostas são um pouco longas e focadas no uso interativo. As diferenças importantes para scripts são:
.cmd
impede a execução inadvertida em sistemas não-NT..cmd
permite que comandos internos alterem o nível de erro para 0 em caso de êxito.Não é tão emocionante, né?
Costumava haver vários recursos adicionais ativados nos
.cmd
arquivos, chamados Extensões de Comando. No entanto, agora eles estão ativados por padrão para arquivos.bat
e.cmd
no Windows 2000 e posterior.Conclusão: em 2012 e além, recomendo o uso
.cmd
exclusivo.fonte
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 command.com vs. cmd.exe nos sistemas da classe WinNT do MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):
fonte
command /c ver
versus iniciar command.com e digitar ver.RE: Aparentemente, quando command.com é chamado, é um mistério um pouco complexo;
Vários meses atrás, durante o curso de um projeto, tivemos que descobrir por que alguns programas que queríamos executar no CMD.EXE estavam, de fato, sendo executados no COMMAND.COM. O "programa" em questão era um arquivo .BAT muito antigo, que ainda é executado diariamente.
Descobrimos que o motivo pelo qual o arquivo em lotes foi 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, substituímo-lo por um atalho convencional da á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 demoramos tanto tempo para descobrir isso foi parcialmente devido ao fato de termos esquecido que seu item no grupo de inicialização era um PIF, porque estava em produção desde 1998.
fonte
Ainda assim, no Windows 7, os arquivos BAT também têm essa diferença: se você criar os arquivos TEST.BAT e TEST.CMD no mesmo diretório e executar o TEST nesse diretório, ele executará o arquivo BAT.
fonte
PATHEXT
variável a extensão .BAT é colocada antes do .CMD (como mostrado nesta resposta). Se você modificar essa ordem no PATHEXT, o test.cmd será executado.PATH
variável de ambiente, independentemente da extensão.Como a postagem original dizia respeito às conseqüências do uso do sufixo .bat ou .cmd , não necessariamente dos comandos dentro do arquivo ...
Outra diferença entre .bat e .cmd é que, se existirem dois arquivos com o mesmo nome e ambas as extensões, então:
inserir nome do arquivo ou nome do arquivo .bat na linha de comando executará o arquivo .bat
Para executar o arquivo .cmd, é necessário inserir o nome do arquivo .cmd
fonte
PATHEXT
variável de ambiente. A ordem na qual as extensões aparecem é a ordem de precedência se uma extensão não for especificada. Também vale ressaltar que não é necessário especificar uma extensão para os arquivos cuja extensão aparece na variável env.tudo que trabalha em um lote deve funcionar em um cmd; O cmd fornece algumas extensões para controlar o ambiente. Além disso, o cmd é executado por um novo interpretador do cmd e, portanto, deve ser mais rápido (não perceptível em arquivos curtos) e mais estável à medida que o bat é executado no ambiente de 16 bits emulado pelo NTVDM
fonte
.bat
não é executado no DOS no NT. Um VDM é iniciado apenas se um programa precisar, e nem é suportado no Windows de 64 bits, embora eu acredite que seja .bat.A execução do arquivo .cmd e .bat é diferente porque em uma variável no nível de erro .cmd, ela pode ser alterada em um comando afetado pelas extensões de comando. É sobre isso mesmo.
fonte
@echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
Acredito que se você alterar o valor da variável de ambiente ComSpec para
%SystemRoot%system32\cmd.exe
(CMD), não importa se a extensão do arquivo é.BAT
ou.CMD
. Não tenho certeza, mas isso pode até ser o padrão para o WinXP e versões posteriores.fonte
Um pouco fora do tópico, mas você já considerou o Windows Scripting Host ? Você pode achar melhor.
fonte
A extensão não faz diferença.
Existem pequenas diferenças entre
COMMAND.COM
manusear o arquivo vsCMD.EXE
.fonte
uma diferença:
Os arquivos .cmd são carregados na memória antes de serem executados. Os arquivos .bat executam uma linha, leem a próxima linha, executam essa linha ...
você pode se deparar com isso ao executar um arquivo de script e editá-lo antes de concluir a execução. arquivos bat ficarão bagunçados com isso, mas arquivos cmd não.
fonte
.btm
arquivos ("batch to memory") como empregados com os intérpretes de comando de substituição do JP Software .echo 1&pause
executará. Você verá1
ePress any key to continue...
. Enquanto estiver em pausa, adicione uma nova linhaecho 2&pause
com o editor externo. Pressione uma tecla Você verá2
ePress any key to continue...
. Você pode até tentar adicionarecho 3&pause
no começo. Quando você pressionar uma tecla depois disso novamente, você verá2
.