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.