batch-file
cmd.exeプロセッサのバグ
サーチ…
前書き
このトピックでは、プロセッサのバグによって引き起こされるエラーに焦点を当てます。ここでは、問題の原因と解決策に焦点を当てることがあります。
備考
DELファイル拡張の例では、ユーザーX. Liuは、 DEL
コマンドのファイル拡張子が3文字未満の場合、このバグは発生しないことに気付きます。
括弧の混乱
このウェブサイトから、OPは問題に気付いています。
原因
次のコードスニペットを考えてみましょう。
if 1==1 (
set /a result = 2*(3+4)
)
一見すると、 CMD.exe
はCMD.exe
ように処理すると考えるかもしれません:
- 条件が真であり、コードブロックを実行する
- 変数結果の値を
14
設定する - 持続する
しかし、 CMD.exe
ように処理します。
- 条件が真であり、コードブロックを実行する
- 計算
2*(3+4
、)
4後はの終わりに処理されるif
、コードブロック - ランダム
)
が登場しました!
2番目の手順では、 Unbalanced parentheses
エラーが返されます。
溶液
ドイツのCMD.exeのset /?
に従ってset /?
算術演算を引用する必要があります。ここに例があります。
前 | 結果 |
---|---|
set /a result=2+5*4 | set /a result="2+5*4" |
ちなみに、英語のCMD.exeによると、 set /?
式に論理演算子または係数演算子が含まれている場合は、引用符が必要です(これは必須のステップではありません )。
不適切なエスケープ文字
このスタックオーバーフローの質問では 、ユーザーtxtechhelpが、セキュリティ問題を引き起こす可能性のある^
文字の問題を発見しました。
原因
anyInvaildCommand ^
注:キャレット( ^
)が最後の文字であることを確認してください!余分なCR\LF
はまったく動作しません!
キャレットは、エスケープする次の文字を探します。しかし、これ以上エスケープできる文字はないので、 cmd
無限ループし、エスケープする文字を探します。この "ループ"プロセスでは、 cmd.exe
はコンピュータのメモリを消費します。徐々にすべての記憶を食べて、コンピューターをひざまずいてください。
この問題は、ロックされていないコンピュータにコードを入力するだけで、より深刻なセキュリティ上の心配につながる可能性があります。
ソリューション
コードページUTF-16を使用するとこの問題を解決できます。 UTF-8またはASCIIのみがバグの原因になります。
ファイルに余分な
CR\LF
があることを確認するか、単にファイルの末尾にキャレットを使用しないでください。
余分な
このバグはWindows 10で解決されているようです。
DELファイル拡張子
このバグは、このMicrosoft Windowsフォーラムのスレッドからsteve2916によって報告されました。
原因
そのようなファイルを含むフォルダを考えてみましょう。
TestA.doc
TestB.doc
TestC.docx
TestD.docx
このディレクトリ内のすべての.doc
ファイルを削除する場合は、通常は次のようにします。
del *.doc
ただし、このコマンドは.docx
ファイルも削除します。このパターンのファイル拡張子でも同じことが起こります。
ファイルA | ファイルB |
---|---|
Anyname。 abc | AnotherName。 abc d |
わかるように、ファイル拡張子文字列にdel
コマンドで使用された文字列が含まれている限り、ファイルは削除されます。このバグは、 del
コマンドで使用される拡張文字列に少なくとも3文字が含まれている場合にのみ発生することに注意してください。たとえば、 del *.do
はA.doc
またはA.docx
削除しません。
溶液
スレッドでは、ユーザーMicroCompsUnltdは、使用していることに気づいたPowershell
問題を解決するだろう。