batch-file
Błędy w procesorze cmd.exe
Szukaj…
Wprowadzenie
W tym temacie skoncentrujemy się na błędach spowodowanych błędami procesora. Oto rzeczy, na których chcielibyśmy skupić się na przyczynie i rozwiązaniu problemu.
Uwagi
W przykładowym rozszerzeniu pliku DEL użytkownik X. Liu zauważa, że ten błąd nie wystąpi, gdy rozszerzenie pliku w poleceniu DEL
ma mniej niż 3 znaki.
Zamieszanie w nawiasach
Z tej strony internetowej PO zauważył problem.
Przyczyna
Rozważ następujący fragment kodu.
if 1==1 (
set /a result = 2*(3+4)
)
Na pierwszy rzut oka możesz pomyśleć, że CMD.exe
przetworzy to tak:
- Warunek jest spełniony, wykonaj blok kodu
- Ustaw wartość wyniku zmiennej na
14
- Kontyntynuj
Jednak proces CMD.exe
tak:
- Warunek jest spełniony, wykonaj blok kodu
- Oblicz
2*(3+4
, the)
po 4 jest przetwarzany na końcu bloku koduif
- Losowo
)
pojawił się!
Drugi krok zwróci błąd Unbalanced parentheses
.
Rozwiązanie
Według niemieckiego zestawu CMD.exe set /?
, musielibyśmy zacytować operacje arytmetyczne. Oto przykład.
Poprzedni | Wynik |
---|---|
set /a result=2+5*4 | set /a result="2+5*4" |
Nawiasem mówiąc, zgodnie z angielskim set /?
CMD.exe set /?
, cudzysłowy są wymagane, jeśli w wyrażeniu występują operatory logiczne lub modułowe (chociaż nie jest to krok konieczny).
Niewłaściwa postać ucieczki
W tym pytaniu dotyczącym przepełnienia stosu użytkownik txtechhelp znalazł problem ze znakiem ^
który może powodować problem z bezpieczeństwem.
Przyczyna
anyInvaildCommand ^
Uwaga: Upewnij się, że karetka ( ^
) jest ostatnim znakiem! Wszelkie dodatkowe CR\LF
ogóle nie będą działać!
Karetka szuka następnej postaci do ucieczki. Jednak nie ma już postaci do ucieczki, więc cmd
zapętla się w nieskończoność, szukając postaci do ucieczki. W tym procesie „pętli” cmd.exe
zużywa pamięć komputera. I stopniowo zjadając całą pamięć, sprowadzając komputer na kolana.
Ten problem może prowadzić do poważniejszych obaw związanych z bezpieczeństwem, ponieważ wystarczy wprowadzić kod do odblokowanego komputera.
Rozwiązania
Użyj strony kodowej UTF-16 może rozwiązać ten problem. Tylko UTF-8 lub ASCII spowodowałoby błąd.
Upewnij się, że w pliku jest dodatkowy
CR\LF
, lub po prostu nie używaj karetki na końcu pliku.
Dodatkowy
Ten błąd wydaje się być rozwiązany w systemie Windows 10.
Rozszerzenie pliku DEL
Ten błąd został zgłoszony przez steve2916 z tego wątku na forum Microsoft Windows.
Przyczyna
Rozważ folder z takimi plikami.
TestA.doc
TestB.doc
TestC.docx
TestD.docx
Jeśli chcemy usunąć cały plik .doc
z tego katalogu, zwykle robimy:
del *.doc
Jednak to polecenie usuwa również pliki .docx
. To samo dzieje się z rozszerzeniami plików z tym wzorcem.
Plik a | Plik B |
---|---|
Jakiekolwiek imię. ABC | Inne imię. abc d |
Jak widać, tak długo, jak ciąg rozszerzenia pliku zawiera ciąg użyty w poleceniu del
, plik zostanie usunięty. Zauważ, że ten błąd występuje tylko wtedy, gdy ciąg rozszerzenia użyty w poleceniu del
ma co najmniej trzy znaki. Na przykład del *.do
A.docx
nie usuwa plików A.doc
ani A.docx
.
Rozwiązanie
W wątku użytkownik MicroCompsUnltd zauważył, że użycie Powershell
rozwiązałoby problem.