バッチファイルからファイル(テキストまたはバイナリ)を読み取るにはどうすればよいですか?バイナリモードまたはテキストモードでそれを読む方法はありますか?
TYPE [fileName]
MS-Dosのコマンドを使用できます。
バッチファイルからファイル(テキストまたはバイナリ)を読み取るにはどうすればよいですか?バイナリモードまたはテキストモードでそれを読む方法はありますか?
TYPE [fileName]
MS-Dosのコマンドを使用できます。
回答:
forコマンドを使用できます。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
タイプ
for /?
for /?
コマンドカンマおよび/またはスペースで区切られたトークンと、本体のために各ラインから2番目と3番目のトークンを渡し、セミコロンで始まる行を無視し、myfile.txtの各行を解析することになります。
NTスタイルのcmd.exeでは、テキストファイルの行を次のようにループできます。
FOR /F %i IN (file.txt) DO @echo %i
詳細については、コマンドプロンプトで「help for」と入力してください。(それがあなたが使っているどんな「DOS」でも機能するかどうかわからない)
%%i
。
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
。
これset "var=%%a"
は、行がDisabledDelayedExpansionでのみ安全であるためです。それ以外の場合、感嘆符は削除され、キャレットは(2次)エスケープ文字として使用され、それらも削除されます。
しかし、変数を使用するvar
とだけ安全ですEnabledDelayedExpansionたとしても、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を見てください。
set /p
。私set /p value=< result.txt
はテキストファイルから最初の行を取得しました
0x1A
どうですか?んfor /F
NUL(と同じように振る舞う0x00
)文字を?
:
または」で始まっていて;
も含まれていても、!
さまざまな方法がありますが、テキストを表示するだけで、どこにも保存しない場合は、次のようにします。 findstr /v "randomtextthatnoonewilluse" filename.txt
修正されたコード:
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
eol=
し、delims=
不要である、set line=%%a
引用符を使用する必要がありますし、遅延拡張モードを切り替えずに、コードは感嘆符を読み取ることができない