dbenham氏によると、/ 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文字
- 行が!
(およびキャレット)が含まれている場合
しかし、その後、あなたは
もう少し複雑なソリューションを使用することができます3210
@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
に置き換えられます。これは、プレフィックスを削除した後に行が空になり、置換が失敗する可能性があるため、最初に行われます。
しかし、なぜ私はそれを置き換えるのですか?
/Fについては、以下が埋め込まれた改行で失敗と同じように、私は、ここに改行を挿入することはできませんので、私は唯一の改行マーカー(このケースでは、私は#L
を使用)が、ファイルの内容を追加し、
です#L
も含めることができますが、すべて#
を#S
に置き換えると、すべてのマーカーが一意です。
endlocal
を使用して遅延拡張を閉じる/無効にするには問題がありますが、変更されたall
とline
変数の内容は保持されます。
これは%%p
がendlocal
バリアの背後にあるコンテンツを運ぶことができるので、FOR/F-endlocal
トリックで行われます。
次に、完全なファイルを読み終えたら、空ファイルのために空であるので、all
が定義されているかどうかをチェックします。
最初の改行マーカー#L
は削除され、他のすべてのマーカーは実際の改行文字に置き換えられます。
その後、シャープな安全な#S
は#
に戻ります。
そうでも、この解決策は明らかにされ、すべての...
出典
2012-05-16 18:10:59
jeb
は^本当にファイルにカラットで、またはことがCRLFのプレースホルダですか?私はこれがWindowsマシンであると仮定しています。 – RobW
キャレットは実際にファイル内にあります。これは、1つの改行文字を含む変数を作成する方法です。 'set LF = ^'の後ろに2つの空白行が続きます – jeb
清算のためのjebに感謝します –