2017-01-05 18 views
1

私はjebが作成したバッチファイルを見ていました。 [HERE]誰かが私に何か説明できますか?誰かが私にこのバッチファイルを説明できますか?

と同様に、機能

for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do 

そして、何set "param=^%~2" !set "param=!param:"=\"!"findstr /p /A:%1 "." "!param!\..\X" nulが何を意味するのでしょうか?

全コード:事前にすべての人に

@echo off 
setlocal EnableDelayedExpansion 
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
    set "DEL=%%a" 
) 

rem Prepare a file "X" with only one dot 
<nul > X set /p ".=." 

call :color 07 "Premi un" 
call :color 0a " tasto " 
call :color 07 "per continuare..." 
pause 

:color 
set "param=^%~2" ! 
set "param=!param:"=\"!" 
findstr /p /A:%1 "." "!param!\..\X" nul 
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%" 
exit /b 

感謝。

+2

プロンプトコマンドを使用して、バックスペース文字を変数に設定するハックなテクニックです。バッチスクリプトの半伝説です。 – npocmaka

答えて

2
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
     set "DEL=%%a" 
    ) 

1つずつ。

  1. コマンド(/fスイッチ)は、別のコマンドの出力を解析します。この場合には、#結果により、分割の第一及び第二のサブストリングを取り
  2. prompt #$H#$E#
  3. セットが脱出し、バックスペース文字(#で区切られた)プロンプトにする(prompt /?をチェック)とecho onそれが可視となります。
  4. for %%b in (1) do rem他にはありませんが、プロンプトが表示されるので、処理することができます。
  5. すべては二重引用符で囲まれているため、エスケープする&は不要です。
  6. 結果として、外側のFORコマンドが文字列を処理します。#backspace#escape#
  7. 最後に、バックスペースはdel変数に割り当てられます。

残りは、着色に使用されるサブルーチンです。

rogue exclamationという簡単な技術を使用して、特殊文字を含む文字列を安全に割り当てることができます。

2行目では、"\"に置き換えます。これは、findstrに必要な引用符のエスケープです。

<nul > X set /p ".=."は、単一ドットの末尾に文字(hereを参照)がないファイルXを作成します。ファイルは後でFINDSTRコマンドで検索されます。

次に色付けです。たとえば、findstr /p /A:05 "." "something\..\X" nulを試してみてください。相対パス(この場合はすでに作成されているX)を含むファイル内のドットが検索され、ファイルへのパスが表示されます。

<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"。最後にこれが使用されます。これはバックスペース文字を(新しい行を使わずに)印刷するので、テキストを色づけするfindstr行に不要なデータは削除されます。findstrで良いことはJeb(読むために一生懸命である理由です、それの色はテキストが独立して(colorコマンドとは違って)「グローバル」のコンソールの色の結論として

これは、ほぼ各ライン上の非文書化ハックを使用していることです

+0

「悪意のある感嘆符」: -/???それについて聞いたことがないし、Googleは助けなかった。リンクの内容をこの用語に関連付けることは役に立たなかった。私は、問題のキャラクターを2つの問題のない文字としてエンコードすることによって、問題キャラクターを保護する方法を示すリンクを検討します。 – dbenham

+0

@dbenham - 実際には(あなたはそれを好きだと言っていました)(http://ss64.org/viewtopic.php?pid=6127#p6127)、これは私がリンクをとった場所です。それはかなり印象的なテクニックでした:) – npocmaka

+0

ああ、私はそれを覚えています。私は確かに技術を「シンプル」と呼んでいないでしょう。そして、私はその言葉を「孤独な」あなたの質問に答えて使用しました!その小さなハックははるかに大きなハックの1つの要素です。 – dbenham

関連する問題