Pliki wsadowe systemu Windows:.bat vs. cmd?

Jak rozumiem, .bat jest starą 16-bitową konwencją nazewnictwa, a .cmd jest dla 32-bitowych okien, tzn. począwszy od NT. Ale nadal to widzę .pliki bat wszędzie i wydają się działać dokładnie tak samo, używając każdego z przyrostków. Zakładając, że mój kod nigdy nie będzie musiał działać na czymś starszym niż NT, czy naprawdę ma znaczenie, w jaki sposób nazwę moje pliki wsadowe, czy jest jakiś gotcha czekający na mnie używając niewłaściwego przyrostka?

Author: Ross Ridge, 2008-09-29

15 answers

From this news group posting by Mark Zbikowski we własnej osobie:

Różnice między .CMD i .Kij do CMD.EXE jest zaniepokojony są: z włączonymi rozszerzeniami, ścieżka / Dołącz/monit/Ustaw / ASSOC w .CMD pliki ustawią poziom błędu niezależnie od błędu. .BAT ustawia ERRORLEVEL tylko na błędy.

 388
Author: Ben Hoffstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 10:20:29

Oto zestawienie zweryfikowanych informacji z różnych odpowiedzi i cytowanych odniesień w tym wątku:]}

  1. command.com to 16-bitowy procesor poleceń wprowadzony w MS-DOS i był również używany w serii systemów operacyjnych Win9x.
  2. cmd.exe jest 32-bitowym procesorem poleceń w systemie Windows NT (64-bitowe systemy operacyjne Windows mają również 64-bitową wersję). cmd.exe nigdy nie była częścią systemu Windows 9x. powstała w wersji OS/2 1.0, a wersja OS / 2 cmd zaczęła się 16-bitowo (ale była niemniej jednak pełnoprawny program trybu chronionego z poleceniami takimi jak start). Windows NT odziedziczył cmd z OS/2, ale Windows NT w wersji Win32 zaczynał od wersji 32-bitowej. Mimo że OS/2 w 1992 roku był 32-bitowy, jego cmd pozostał 16-bitowy OS/2 1.program X.
  3. zmienna ComSpec ENV określa, który program jest uruchamiany przez skrypty .bat i .cmd. (Począwszy od WinNT domyślnie jest to cmd.exe.)
  4. {[1] } jest wstecznie kompatybilny z command.com.
  5. skrypt przeznaczony dla cmd.exe może być nazwany .cmd, aby zapobiec przypadkowemu wykonaniu w systemie Windows 9x. to rozszerzenie nazwy pliku pochodzi również z wersji OS/2 1.0 i 1987.

Oto lista cmd.exe funkcji, które nie są obsługiwane przez command.com:

  • długie nazwy plików (przekraczające format 8.3)
  • Historia poleceń
  • uzupełnianie tabulatury
  • Escape character: ^ (Użyj dla: \ & | > < ^)
  • stos katalogów: PUSHD/POPD
  • arytmetyka całkowita: SET /A i+=1
  • Search / Replace/ Substring: SET %varname:expression%
  • podstawienie polecenia: FOR /F (istniało wcześniej, zostało wzmocnione)
  • funkcje: CALL :label

Kolejność wykonania:

Jeśli oba .bat i .wersje cmd skryptu (test.bat, test.cmd) znajdują się w tym samym folderze i uruchamiasz skrypt bez rozszerzenia (test), domyślnie the .wersja bat skryptu zostanie uruchomiona, nawet na 64-bitowym Windows 7. Kolejność wykonania jest kontrolowana przez środowisko PATHEXT zmienna. Zobacz kolejność, w jakiej Wiersz polecenia wykonuje pliki , aby uzyskać więcej szczegółów.

Bibliografia:

Wikipedia: porównanie powłok poleceń

 368
Author: Chris Noe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:22

Te odpowiedzi są nieco zbyt długie i koncentrują się na interaktywnym użyciu. Istotne różnice to:

  • .cmd zapobiega nieumyślnemu wykonaniu w systemach innych niż NT.
  • .cmd włącza wbudowane polecenia, aby zmienić poziom błędu na 0 po pomyślnym zakończeniu.

Edit: rozszerzenia poleceń są domyślnie włączone w obu .bat i .pliki cmd w systemie Windows 2000 lub nowszym.

W 2012 roku i Później, polecam używać .cmd wyłącznie.

 44
Author: Gringo Suave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 03:42:14

Nie - to nie ma najmniejszego znaczenia. Na NT .bat i .rozszerzenie cmd powoduje zarówno cmd.procesor exe do przetwarzania pliku w dokładnie taki sam sposób.

Dodatkowe ciekawe informacje o command.com vs. cmd.exe na systemach klasy WinNT z MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx):

To zachowanie ujawnia dość subtelny cecha systemu Windows NT, która jest bardzo ważne. 16-bitowa powłoka MS-DOS (COMMAND.COM), że statki z oknami NT jest specjalnie zaprojektowany Dla Windows NT. Po wpisaniu polecenia dla wykonanie przez tę powłokę, nie właściwie to wykonaj. Zamiast tego pakuje Tekst polecenia i wysyła go do 32-bitowego CMD.Exe command shell for egzekucja. Ponieważ wszystkie polecenia są faktycznie stracony przez CMD.EXE (the Windows NT command shell), 16-bitowy shell dziedziczy wszystkie funkcje i wyposażenie pełnego Windows NT shell.

 25
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 23:34:10

RE: podobno kiedy command.com jest wywoływany jest trochę skomplikowaną tajemnicą;

Kilka miesięcy temu, w trakcie realizacji projektu, musieliśmy dowiedzieć się, dlaczego niektóre programy, które chcieliśmy uruchomić pod CMD.EXE w rzeczywistości działały pod COMMAND.COM. omawiany "program" był bardzo stary .Plik BAT, który nadal działa codziennie.

Odkryliśmy, że powodem, dla którego plik wsadowy działał pod COMMAND.COM jest to, że został on uruchomiony z .Plik PIF (także ancient). 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 CMD.EXE. Kiedy o tym pomyślisz, to ma sens. Powodem, dla którego zajęło nam to tak długo, było częściowo to, że zapomnieliśmy, że jego pozycja w grupie startupowej to PIF, ponieważ był w produkcji od 1998 roku.

 15
Author: David Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-07 22:47:44

Ponieważ oryginalny post dotyczył konsekwencji korzystania zbat lub .cmd przyrostek, niekoniecznie polecenia wewnątrz pliku...

Jeszcze jedna różnica między .bat i .cmd polega na tym, że jeśli istnieją dwa pliki o tej samej nazwie i obu tych rozszerzeniach, to:

  • Wpisanie filename lub filename.bat w wierszu poleceń uruchomi .plik bat

  • Aby uruchomić .plik cmd, musisz wpisać nazwa pliku .cmd

 13
Author: Rob at TVSeries.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 14:46:29

Jednak w Windows 7 Pliki BAT mają również tę różnicę: jeśli kiedykolwiek utworzysz pliki TEST.BAT i TEST.CMD w tym samym katalogu, a Ty uruchomisz TEST w tym katalogu, to uruchomi plik 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>
 10
Author: tvCa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-22 17:04:09

Wszystko, co działa w partii, powinno działać w cmd; cmd zapewnia pewne rozszerzenia do kontrolowania środowiska. ponadto, cmd jest wykonywane przez nowy interpreter cmd i dlatego powinno być szybsze (nie zauważalne na krótkich plikach) i stabler, ponieważ bat działa pod emulowanym środowiskiem ntvdm 16bit

 8
Author: Lorenzo Boccaccia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 14:47:51

Wierzę, że jeśli zmienisz wartość zmiennej środowiskowej ComSpec na %SystemRoot%system32 \ cmd.exe to nie ma znaczenia, czy rozszerzenie pliku jest .BAT lub .CMD. Nie jestem pewien, ale może to być nawet domyślne dla WinXP i powyżej.

 3
Author: Patrick Cuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 17:40:39

Nieco off topic, ale czy rozważałeś Windows Scripting Host? Może Ci się spodoba.

 3
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-08 21:52:40

.cmd i .wykonanie pliku bat jest inne, ponieważ wzmienna cmd errorlevel może zmienić polecenie, na które mają wpływ rozszerzenia poleceń. To wszystko.

 3
Author: zask,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 18:56:49

Rozszerzenie nie robi różnicy. Istnieją niewielkie różnice między COMMAND.COM obsługa pliku a CMD.EXE

 2
Author: Waldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 14:45:17

Oto jedna różnica, którą odkryłem: EnableDelayedExpansion jest wymagane W .cmd plikach.
Gdzie jak w przypadku plików .bat domyślnie jest to niejawne. (Windows 10)

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

To działa w .bat, ale zawsze jest found W przypadku pliku .cmd.
Zmiana line 2 na następujące sprawia, że działa zgodnie z oczekiwaniami:

if %ERRORLEVEL% equ 0       (

I na koniec dla pliku .cmd działa to poprawnie:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...
 -2
Author: Ujjwal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 23:24:56

Jako programista Cmd i patrząc po całej sieci, naprawdę nie ma znaczenia, którego z nich używasz, możesz mieć .bat program na Windows 7 i uruchomić go na Windows 10. ale jeśli chcesz to zrobić w systemie Windows 10, prawdopodobnie nie będziesz w stanie uruchomić wszystkich poleceń w systemie Windows 7. A .cmd jest dokładnie taki sam sposób i uruchamia dokładnie ten sam program i kody.

Różnica polega na tym, że to inna nazwa tego samego programu, dopóki jest podłączony do CMD.EXE, działa te same polecenia.

 -3
Author: Shae Noble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 18:05:09

Różnica:

.pliki cmd są ładowane do pamięci przed wykonaniem. .pliki bat wykonują linię, odczytują następną linię, wykonują tę linię...

Można natknąć się na to, gdy wykonujesz plik skryptu, a następnie edytujesz go przed wykonaniem. pliki bat będą przez to pomieszane, ale pliki cmd nie.

 -10
Author: grey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-03 20:22:22