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


97

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


@ RookieTEC9:はい、私はそれらが2つのまったく異なるものであることを知っていますが、Windows NT(または新しいバージョン)ではなくmsdosで機能する回答が必要でした。また、この質問は7年前に尋ねられましたが、それを念頭に置いてください
Lucas Gabrielサンチェス

@ RookieTEC9:私はあなたが正しいと思います、これからしばらく経ちました。ms-dosタグを削除します
Lucas GabrielSánchez15年

1
TYPE [fileName]MS-Dosのコマンドを使用できます。
RookieTEC9 2015年

それは私の仕事にこれを試してみる- stackoverflow.com/a/31919715/4534414
Anurag_BEHS

回答:


40

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

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

タイプ

for /?

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


25
これはかなり複雑な例であり、特別にフォーマットされたテキストファイルから非常に具体的な情報を解析しますが、説明はありません。どおりfor /?コマンドカンマおよび/またはスペースで区切られたトークンと、本体のために各ラインから2番目と3番目のトークンを渡し、セミコロンで始まる行を無視し、myfile.txtの各行を解析することになります。
Martin Prikryl、2014

2
あなたの例はcmd.exeのヘルプからです。そのためのヒントを追加するか、説明全体をコピーする必要があります。
Th。ティーレマン

70

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

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

詳細については、コマンドプロンプトで「help for」と入力してください。(それがあなたが使っているどんな「DOS」でも機能するかどうかわからない)


22
それはあるはずです%%i
ジムフェル

32
このコマンドは、空白文字が見つかると、行の読み取りを中止します。最終的には、FOR / F "tokens = *" %% i IN(file.txt)DO @ECHO %% iを使用することになりました
Jason

9
できます!コンソールを使用している場合、%iを試します。batファイルを使用している場合は、%% iを試します。
Steven Du

41

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はテキストファイルから最初の行を取得しました
SteveC

Jeb、私は上のソリューションに基づいて、stackoverflow.com
Nicholas

EOF(ファイルの終わり)文字、ASCIIは0x1Aどうですか?んfor /FNUL(と同じように振る舞う0x00)文字を?
aschipfl

@aschipfl私は、0x1Aがラインフィードのように動作する場合があると思います(または、ラインフィードに変換する方が良いでしょう)。一時ファイルを使用せずにSUBを作成する方法はありますか?
2015

これは受け入れられる答えである必要があります。行が「:または」で始まっていて;も含まれていても、!
間違いはありません

10

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

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

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

type %pathtotextfile%\textfile.txt

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


1

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


0

修正されたコード:

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

ページのメインコードの。引用符が正しく配置されていません。コードはスペースを含む名前のファイルには適していません。私のです。ここでは^^^^のトリックを紹介します
Celes

ファイル名の前後に引用符を使用するとしている権利が、あなたのコードは、いくつかの問題がありますeol=し、delims=不要である、set line=%%a引用符を使用する必要がありますし、遅延拡張モードを切り替えずに、コードは感嘆符を読み取ることができない
ジェブ

-1
set a=type 1.csv

これは1.csvの内容を変数 'a'に保存します:

ここに画像の説明を入力してください


2
これはファイルの内容を変数に格納するのではなく、コマンドを格納するtype 1.csvため、%a%そのコマンドを実行するだけです。とを確認しますset a
ステファン・

-5

myfile.txtファイルの内容を画面に表示するコード

セット%filecontent%= 0
タイプ%filename%>>%filecontent%
echo%filecontent%


3
投稿する前に、少なくともコードを試してください。それはナンセンスです。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.