batch-file
Bugs in cmd.exe-processor
Zoeken…
Invoering
Dit onderwerp richt zich op fouten die worden veroorzaakt door processorfouten. Hier zijn de dingen die we ons zouden concentreren op de oorzaak en de oplossing van het probleem.
Opmerkingen
In het voorbeeld DEL File Extension , merkt gebruiker X. Liu op dat deze bug niet zal optreden wanneer de bestandsextensie in de DEL
opdracht minder dan 3 tekens bevat.
Haakjes verwarring
Vanaf deze website heeft het OP een probleem opgemerkt.
Oorzaak
Overweeg het volgende codefragment.
if 1==1 (
set /a result = 2*(3+4)
)
Op het eerste gezicht denkt u misschien dat CMD.exe
het zo zou verwerken:
- De voorwaarde is waar, voer een codeblok uit
- Stel de waarde van het variabele resultaat in op
14
- Doorgaan met
CMD.exe
als volgt:
- De voorwaarde is waar, voer een codeblok uit
- Bereken
2*(3+4
, de)
nadat 4 is verwerkt aan het einde vanif
codeblok - Een willekeurige
)
is verschenen!
De tweede stap zou een fout Unbalanced parentheses
opleveren.
Oplossing
Volgens een Duitse CMD.exe's set /?
zouden we rekenkundige operaties moeten citeren. Hier is een voorbeeld.
voorgaand | Resultaat |
---|---|
set /a result=2+5*4 | set /a result="2+5*4" |
Trouwens, volgens een Engelse CMD.exe- set /?
, aanhalingstekens zijn vereist als logische of modulus-operatoren aanwezig zijn in de uitdrukking (hoewel dit geen verplichte stap is).
Onjuist ontsnappingskarakter
In deze Stack Overflow-vraag vond gebruiker txtechhelp een probleem met het ^
-teken dat een beveiligingsprobleem kon veroorzaken.
Oorzaak
anyInvaildCommand ^
Opmerking: zorg ervoor dat het kruisje ( ^
) het laatste teken is! Elke extra CR\LF
werkt helemaal niet!
De caret zoekt naar het volgende karakter om te ontsnappen. Er zijn echter geen personages meer beschikbaar om te ontsnappen, dus cmd
loopt oneindig op zoek naar een personage om te ontsnappen. In dit "lus" -proces verbruikt cmd.exe
uw computergeheugen. En geleidelijk alle geheugen opeten, waardoor de computer op zijn knieën komt.
Dit probleem kan leiden tot ernstiger beveiligingsproblemen, omdat je de code gewoon in de ontgrendelde computer kunt invoeren.
Oplossingen
Gebruik codepagina UTF-16 kan dit probleem oplossen. Alleen UTF-8 of ASCII zou de bug veroorzaken.
Zorg ervoor dat er een extra
CR\LF
in het bestand zit, of gebruik gewoon geen caret aan het einde van het bestand.
Extra
Deze bug lijkt te zijn opgelost in Windows 10.
DEL Bestandsextensie
Deze bug is gemeld door steve2916 uit deze Microsoft Windows Forum-thread.
Oorzaak
Overweeg een map met dergelijke bestanden.
TestA.doc
TestB.doc
TestC.docx
TestD.docx
Als we alle .doc
bestanden in deze map willen verwijderen, doen we meestal:
del *.doc
Met deze opdracht worden echter ook de .docx
bestanden verwijderd. Hetzelfde gebeurt op bestandsextensies met dit patroon.
Dien een ... in | Bestand B |
---|---|
Iedere naam. abc | Een andere naam. abc d |
Zoals we kunnen zien, wordt het bestand verwijderd zolang de bestandsextensiereeks de tekenreeks bevat die wordt gebruikt in de opdracht del
. Merk op dat deze bug alleen optreedt wanneer de extensiereeks die wordt gebruikt in de opdracht del
ten minste drie tekens bestaat. Bijvoorbeeld, del *.do
A.doc
verwijdert A.doc
of A.docx
.
Oplossing
In de thread merkte gebruiker MicroCompsUnltd op dat het gebruik van Powershell
het probleem zou oplossen.