8

file.txtというファイルがあります。このファイルには次のものが含まれています。

     this is line one ^
     this is line two ^
     this is the last line

どうすればそれをenvvarに入れることができますか?

私はバッチファイルからこれを行うことができます:test.bat

    set LF=^
    [blank line]
    [blank line]
    rem two blank lines needed above
    set multi=Line 1!LF!Line 2!LF!Last line
    echo !multi!

これは3行を出力します:

      Line 1
      Line 2
      Last line

では、どうすればfile.txtをバッチファイル内のenvvarに取り込むことができますか?

4

2 に答える 2

8

dbenhamが言ったように、for / fでも実行できますが、もう少し複雑です。

単純な80%のソリューションは

setlocal EnableDelayedExpansion

set "var="
set LF=^


rem *** Two empty lines are required for the linefeed
FOR /F "delims=" %%a in (myFile.txt) do (
  set "var=!var!!LF!%%a"
)
echo !var!

ただし、次の場合に失敗します。-
行が空白の場合はスキップされます-行がEOL文字
で始まる場合 -行に(およびキャレット) が含まれている場合;
!

しかし、それならもう少し複雑な解決策を使うことができます

@echo off
SETLOCAL DisableDelayedExpansion
set "all="
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
    set "line=%%a"
    SETLOCAL EnableDelayedExpansion
    set "line=!line:#=#S!"
    set "line=!line:*:=!"
    for /F "delims=" %%p in ("!all!#L!line!") do (
        ENDLOCAL
        set "all=%%p"
    )
)
SETLOCAL EnableDelayedExpansion
if defined all (
set "all=!all:~2!"
set ^"all=!all:#L=^

!"
set "all=!all:#S=#!"
)
echo !all!

コードは何をしますか?
まず、findstr /n ^^各行の前に行番号とコロンを付けます。

1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line

これにより、空行の問題が解決され、標準のEOL文字;も無視できます。
行の内容を取得するために、遅延拡張が無効になっているときに値が変数に設定されます。これにより、!および^文字の問題が解決されます。

行番号とコロンを削除するために、遅延拡張が有効になります(いいえ、デリムは:それを解決できません)。

次に、すべて#がに置き換えられ#Sます。これは最初に行われます。プレフィックスを削除した後、行が空になり、置き換えが失敗する可能性があるためです。
しかし、なぜ私はそれを交換するのですか?
これは、次のFOR / Fが埋め込みラインフィードで失敗するため、ここにラインフィードを挿入できないためです。したがって、ラインフィードマーカー
のみを追加します(この場合はを使用します)が、ファイルのコンテンツには、も含まれる可能性がありますが、すべてをすべてのマーカー に置き換えるのはユニークです。#L#L##S

マーカーの後に、で遅延拡張を閉じる/無効にするという問題がありますが、変更された変数endlocalの内容は保持されます。はバリア の背後でコンテンツを転送できるため 、これはトリックで行われます。allline
FOR/F-endlocal%%pendlocal

次に、完全なファイルを読み取った後all、空のファイルの場合は空になるため、が定義されているかどうかを確認します。
次に、最初の改行マーカー #Lが削除され、他のすべてのマーカーが実際の改行文字に置き換えられます。
その後、シャープセーフ#Sはに戻り#ます。

それがすべてなので、このソリューションでさえ明らかに...

于 2012-05-16T18:10:59.427 に答える
3

あなたはほとんどそこにいました。テキストの各行を読んでから、その行と改行を変数に追加する必要があります。

!FOR / Fを使用することもできますが、コンテンツに文字が含まれている場合、拡張の遅延ではうまく機能しません。また、空白行を保持するのも厄介で、EOLオプションを無効にするのも厄介です。

より簡単な解決策は、SET/Pを使用して行を読み取ることです。この手法の制限は次のとおりです。

1)各行の末尾の制御文字をトリミングします

2)ファイルは、キャリッジリターン、ラインフィードのWindows標準ラインターミネータを使用する必要があります。Unixスタイルの改行では機能しません。

3)1行あたり1023バイトの読み取りに制限されています(行末文字は含まれません)

環境変数は8キロバイト弱のデータしか保持できないことに注意してください。したがって、この手法では、非常に小さなファイルを変数にロードするだけに制限されます。

@echo off
setlocal enableDelayedExpansion
set LF=^


:: Two blank lines above needed for definition of LF - do not remove
set file="test.txt"
set "var="
for /f %%N in ('find /c /v "" ^<%file%') do set lineCnt=%%N
<%file% (
  for /l %%N in (1 1 %lineCnt%) do (
    set "ln="
    set /p "ln="
    set "var=!var!!ln!!lf!"
  )
)
set var
于 2012-05-15T20:46:39.233 に答える