Jak rozumiem, .bat
jest to stara 16-bitowa konwencja nazewnictwa, i .cmd
dotyczy 32-bitowego systemu Windows, tj. Zaczynającego się od NT. Ale nadal widzę pliki .bat wszędzie i wydaje się, że działają dokładnie tak samo, używając jednego z sufiksów. Zakładając, że mój kod nie będzie trzeba uruchomić na coś starszego niż NT, to naprawdę ważne, w jaki sposób mogę wymienić moje pliki wsadowe, czy jest jakiś haczyka w oczekiwaniu na mnie zły za pomocą przyrostka?
windows
batch-file
cmd
Chris Noe
źródło
źródło
Odpowiedzi:
Z tego posta opublikowanego przez samego Marka Zbikowskiego :
Innymi słowy, jeśli ERRORLEVEL ma wartość inną niż 0, a następnie uruchomisz jedno z tych poleceń, wynikowy ERRORLEVEL będzie:
źródło
set var=..
instrukcji. Co jest dziwne, ponieważ założyłem, że było to oczekiwane zachowanie. Można argumentować na oba sposoby. Zostanę przy plikach .bat. :-)DPATH /?
nadal wyświetla polecenie jako APPEND. Ponadto artykuł na Wiki został w większości poprawiony, z tym wyjątkiem, że nie zawiera DPATH.Oto zestawienie zweryfikowanych informacji z różnych odpowiedzi i cytowanych referencji w tym wątku:
command.com
to 16-bitowy procesor poleceń wprowadzony w MS-DOS i był również używany w systemach operacyjnych z serii Win9x.cmd.exe
to 32-bitowy procesor poleceń w systemie Windows NT (64-bitowe systemy operacyjne Windows mają również wersję 64-bitową).cmd.exe
nigdy nie był częścią systemu Windows 9x. Powstał w wersji OS / 2 1.0, a wersja OS / 2cmd
rozpoczęła 16-bit (ale mimo to był w pełni rozwiniętym programem w trybie chronionym z podobnymi poleceniamistart
). Windows NT odziedziczyłcmd
po OS / 2, ale wersja Win32 systemu Windows NT rozpoczęła się od wersji 32-bitowej. Mimo że OS / 2 przeszedł na wersję 32-bitową w 1992 roku,cmd
pozostał 16-bitowym programem OS / 2 1.x.ComSpec
Zmienne env definiuje, jaki program jest uruchomiony przez.bat
i.cmd
skrypty. (Począwszy od WinNT, domyślnie jest tocmd.exe
.)cmd.exe
jest wstecznie kompatybilny zcommand.com
.cmd.exe
można nazwać,.cmd
aby zapobiec przypadkowemu uruchomieniu w systemie Windows 9x. To rozszerzenie nazwy pliku pochodzi także z wersji OS / 2 1.0 i 1987.Oto lista
cmd.exe
funkcji, które nie są obsługiwane przezcommand.com
:^
(Użyj dla\ & | > < ^
:)PUSHD
/POPD
SET /A i+=1
SET %varname:expression%
FOR /F
(istniało wcześniej, zostało ulepszone)CALL :label
Kolejność wykonania:
Jeśli obie wersje skryptu .bat i .cmd (test.bat, test.cmd) znajdują się w tym samym folderze i uruchomisz skrypt bez rozszerzenia (test), domyślnie uruchomiona zostanie wersja .bat skryptu, nawet w 64-bitowym systemie Windows 7. Kolejność wykonywania jest kontrolowana przez zmienną środowiskową PATHEXT. Aby uzyskać więcej informacji, zobacz Kolejność, w której wiersz polecenia wykonuje pliki .
Bibliografia:
wikipedia: Porównanie powłok poleceń
źródło
dir filename
jest taki sam jakdir filename.*
w command.com; symbol wieloznaczny jest wymagany w cmd.exe. W Command.comrem Create an empty file > empty.txt
działa; nie w cmd.exe.Te odpowiedzi są nieco za długie i koncentrują się na interaktywnym użyciu. Ważnymi różnicami dla skryptów są:
.cmd
zapobiega niezamierzonemu wykonaniu w systemach innych niż NT..cmd
włącza wbudowane polecenia zmiany poziomu błędu na 0 po sukcesie.Nie takie ekscytujące, prawda?
Kiedyś w
.cmd
plikach włączono wiele dodatkowych funkcji , zwanych rozszerzeniami poleceń. Jednak są one teraz domyślnie włączone zarówno dla plików, jak.bat
i dla.cmd
systemu Windows 2000 i nowszych.Podsumowując: w 2012 roku i później polecam używać
.cmd
wyłącznie.źródło
Nie - nie ma to najmniejszego znaczenia. W NT rozszerzenie .bat i .cmd powodują, że procesor cmd.exe przetwarza plik dokładnie w ten sam sposób.
Dodatkowe interesujące informacje o Command.com vs. cmd.exe w systemach klasy WinNT od MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):
źródło
command /c ver
kontra uruchomienie command.com i wpisanie ver.RE: Najwyraźniej, kiedy wywoływane jest polecenie command.com, jest to trochę skomplikowana tajemnica;
Kilka miesięcy temu, w trakcie projektu, musieliśmy dowiedzieć się, dlaczego niektóre programy, które chcieliśmy uruchomić pod CMD.EXE, faktycznie działały pod COMMAND.COM. „Program”, o którym mowa, był bardzo starym plikiem .BAT, który wciąż działa codziennie.
Odkryliśmy, że powodem, dla którego plik wsadowy działał w COMMAND.COM, jest to, że był uruchamiany z pliku .PIF (również starożytnego). Ponieważ specjalne ustawienia konfiguracji pamięci dostępne tylko przez PIF stały się nieistotne, zastąpiliśmy je konwencjonalnym skrótem na pulpicie.
Ten sam plik wsadowy, uruchomiony ze skrótu, działa w programie CMD.EXE. Kiedy się nad tym zastanowić, ma to sens. Powodem, dla którego tak długo nam to zajęło, było częściowo to, że zapomnieliśmy, że jego pozycją w grupie startupowej był MTP, ponieważ jest produkowany od 1998 roku.
źródło
Jednak w systemie Windows 7 pliki BAT mają również tę różnicę: jeśli kiedykolwiek utworzysz pliki TEST.BAT i TEST.CMD w tym samym katalogu i uruchomisz TEST w tym katalogu, uruchomi on plik BAT.
źródło
PATHEXT
zmiennej rozszerzenie .BAT jest umieszczane przed .CMD jeden (jak pokazano w tej odpowiedzi). Jeśli zmodyfikujesz tę kolejność w PATHEXT, zamiast tego zostanie wykonany test.cmd.PATH
zmiennej środowiskowej niezależnie od rozszerzenia.Ponieważ oryginalny post dotyczył konsekwencji użycia sufiksu .bat lub .cmd , niekoniecznie polecenia w pliku ...
Inną różnicą między .bat i .cmd jest to, że jeśli istnieją dwa pliki o tej samej nazwie i obu rozszerzeniach, to:
wprowadzenie nazwy pliku lub pliku .bat w wierszu polecenia spowoduje uruchomienie pliku .bat
aby uruchomić plik .cmd, musisz wprowadzić nazwę pliku .cmd
źródło
PATHEXT
zmiennej środowiskowej. Kolejność wyświetlania rozszerzeń jest kolejnością pierwszeństwa, jeśli rozszerzenie nie jest określone. Warto również wspomnieć, że nie jest konieczne określanie rozszerzenia dla plików, których rozszerzenie pojawia się w zmiennej env.wszystko działające w partii powinno działać w cmd; cmd zapewnia pewne rozszerzenia do kontrolowania środowiska. cmd jest również wykonywany przez nowy interpreter cmd i dlatego powinien być szybszy (niewidoczny na krótkich plikach) i stabilny, ponieważ bat działa w środowisku 16-bitowym emulowanym NTVDM
źródło
.bat
nie działa pod DOS-em w NT. VDM jest uruchamiany tylko wtedy, gdy program go potrzebuje, i nie jest nawet obsługiwany w 64-bitowym systemie Windows, chociaż uważam, że .bat jest.Wykonywanie plików .cmd i .bat jest inne, ponieważ w zmiennej poziomu błędu .cmd może zmieniać się w przypadku polecenia, którego dotyczą rozszerzenia poleceń. To naprawdę o to chodzi.
źródło
@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
Uważam, że jeśli zmienisz wartość zmiennej środowiskowej ComSpec na
%SystemRoot%system32\cmd.exe
(CMD), to nie ma znaczenia, czy rozszerzenie pliku to.BAT
lub.CMD
. Nie jestem pewien, ale może nawet być domyślny dla WinXP i wyższych.źródło
Nieco temat, ale czy zastanawiałeś się nad hostem skryptów Windows ? Możesz znaleźć to ładniejsze.
źródło
Rozszerzenie nie ma znaczenia.
Istnieją niewielkie różnice między
COMMAND.COM
obsługą pliku aCMD.EXE
.źródło
różnica:
Pliki .cmd są ładowane do pamięci przed uruchomieniem. Pliki .bat wykonują wiersz, czytają następny wiersz, wykonują ten wiersz ...
możesz zetknąć się z tym, wykonując plik skryptu, a następnie edytując go, zanim zakończy się wykonywanie. pliki bat będą przez to pomieszane, ale pliki cmd nie.
źródło
.btm
plikach („wsadowych do pamięci”) stosowanych w interpreterach poleceń zastępujących JP Software .echo 1&pause
następnie go uruchomi. Zobaczysz1
iPress any key to continue...
. Podczas wstrzymania dodaj nową linię zaecho 2&pause
pomocą zewnętrznego edytora. Naciśnij klawisz. Zobaczysz2
iPress any key to continue...
. Możesz nawet spróbować dodaćecho 3&pause
na początku. Po ponownym naciśnięciu klawisza zobaczysz2
.