バッチ ファイルからファイル (テキストまたはバイナリ) を読み取るにはどうすればよいですか? バイナリモードまたはテキストモードで読み取る方法はありますか?
7 に答える
NT スタイルの cmd.exe では、次のようにテキスト ファイルの行をループできます。
FOR /F %%i IN (file.txt) DO @echo %%i
詳細については、コマンド プロンプトで「help for」と入力してください。(使用している「DOS」で機能するかどうかはわかりません)
FOR-LOOP は通常は機能しますが、いくつかの問題があります。FOR は空の行を受け入れず、〜 8190 を超える行は問題があります。遅延拡張が無効になっている場合、拡張は確実にのみ機能します。
CR/LF と単一の LF の検出も少し複雑に思えます。
また、FOR ループが読み取りを即座にキャンセルするため、NUL 文字も問題があります。
したがって、バイナリを直接読み取ることはほとんど不可能に思えます。
空行の問題は、トリックで解決できます。findstr コマンドを使用して、各行に行番号のプレフィックスを付け、読み取り後にプレフィックスを削除します。
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
!
やなどの文字列を安全に操作するには、遅延展開の有効化と無効化を切り替える必要があります^^^xy!z
。
これは、行がDisabledDelayedExpansionset "var=%%a"
でのみ安全であるためです。それ以外の場合、感嘆符が削除され、キャレットが (2 次) エスケープ文字として使用され、それらも削除されます。
ただし、変数の使用はEnabledDelayedExpansionでのみ安全です。var
call %%var%%
"&"&
編集: set/p バリアントを追加 を
使用してファイルを読み取る 2 番目の方法がありますset /p
。唯一の欠点は、1 行あたり ~1024 文字に制限され、行末の制御文字が削除されることです。
しかし、利点は、遅延トグルが必要なく、変数に値を格納する方が簡単であることです。
@echo off
setlocal EnableDelayedExpansion
set "file=%~1"
for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"
<%file% (
for /l %%l in (1 1 !len!) do (
set "line="
set /p "line="
echo(!line!
)
)
「バイナリ」を16進数表現に読み取るには
、SOを見ることができます:バッチファイルを使用してバイナリファイルを16進数表現に変換する
for コマンドを使用できます。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
タイプ
for /?
コマンドプロンプトで。また、ini ファイルを解析することもできます。