109

バッチ ファイルからファイル (テキストまたはバイナリ) を読み取るにはどうすればよいですか? バイナリモードまたはテキストモードで読み取る方法はありますか?

4

7 に答える 7

76

NT スタイルの cmd.exe では、次のようにテキスト ファイルの行をループできます。

FOR /F %%i IN (file.txt) DO @echo %%i

詳細については、コマンド プロンプトで「help for」と入力してください。(使用している「DOS」で機能するかどうかはわかりません)

于 2008-10-15T19:45:02.597 に答える
43

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でのみ安全です。
varcall %%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進数表現に変換する

于 2010-12-25T17:54:47.933 に答える
39

for コマンドを使用できます。

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

タイプ

for /?

コマンドプロンプトで。また、ini ファイルを解析することもできます。

于 2008-10-15T19:47:00.003 に答える