web-dev-qa-db-ja.com

バッチファイル:ファイルの読み方

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

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

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

タイプ

for /?

コマンドプロンプトで。また、 iniファイルを解析

40
johnstok

NTスタイルのcmd.exeでは、次のコマンドでテキストファイルの行をループできます。

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

詳細については、コマンドプロンプトで「help for」と入力してください。 (使用している「DOS」で動作するかどうかわからない)

64
devio

FOR-LOOPは一般に機能しますが、いくつかの問題があります。 FORは空の行を受け入れず、〜8190を超える行には問題があります。遅延拡張が無効になっている場合、拡張は信頼性のある動作のみを行います。

CR/LFと単一のLFの検出も少し複雑に思えます。
また、NUL文字には問題があります。FOR-Loopが直ちに読み取りをキャンセルするためです。

Directしたがって、バイナリ読み取りはほとんど不可能に思えます。

空行の問題は、トリックで解決できます。 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などの文字列を安全に操作するには、遅延展開の有効化と無効化の切り替えが必要です
これは、set "var=%%a"行がDisabledDelayedExpansionでのみ安全であるためです。そうでない場合、感嘆符は削除され、キャレットは(2次)エスケープ文字として使用され、それらも削除されます。
ただし、変数varの使用は、EnabledDelayedExpansionでのみ安全です。これは、call %%var%%でさえ"&"&などのコンテンツで失敗するためです。

編集:set/pバリアントの追加
set /pを使用してファイルを読み取る2番目の方法があります。唯一の欠点は、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:バッチファイルを使用してバイナリファイルをHEX表現に変換する を見ることができます

35
jeb

非常に簡単な方法の1つは、次のコマンドを使用することです。

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

これにより、テキストファイルのテキストの最初の行のみが表示されます。もう1つの方法は、次のコマンドを使用することです。

type %pathtotextfile%\textfile.txt

これにより、すべてのデータが画面上のテキストファイルに配置されます。お役に立てれば!

6
J. Bond

さまざまな方法がありますが、テキストを表示するだけで、どこにも保存しない場合は、次を使用します:findstr /v "randomtextthatnoonewilluse" filename.txt

1
NetvorMcWolf

修正されたコード:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause
0
Celes