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
の内容は保持されます。はバリア の背後でコンテンツを転送できるため
、これはトリックで行われます。all
line
FOR/F-endlocal
%%p
endlocal
次に、完全なファイルを読み取った後all
、空のファイルの場合は空になるため、が定義されているかどうかを確認します。
次に、最初の改行マーカー #L
が削除され、他のすべてのマーカーが実際の改行文字に置き換えられます。
その後、シャープセーフ#S
はに戻り#
ます。
それがすべてなので、このソリューションでさえ明らかに...