Convert CRLF to LF
Moderator: DosItHelp
Convert CRLF to LF
I'm sending a file generated in Windows to a Linux machine, I need to replace the line terminator 'CRLF' the terminator 'LF'.
How can I do this?
How can I do this?
Re: Convert CRLF to LF
I usually use a DOS2UNIX utility. Plenty of them out there.
http://dos2unix.sourceforge.net/
http://dos2unix.sourceforge.net/
Re: Convert CRLF to LF
[edit]
This CRLFtoLF conversion fails if the source contains single linefeeds, they are both converted and appended at the end
LFtoCRLF is easyYet this post shows how to read in hex and this post shows you can convert :hex2str But I never needed it so I stop here
This CRLFtoLF conversion fails if the source contains single linefeeds, they are both converted and appended at the end
Code: Select all
@echo off &setlocal disableDelayedExpansion
set "$iFile=CRLFtoLF.TXT"
set "$oFile=ou.TXT"
set $lf=^
::
for /f %%? in (
'2^>nul ^( ^< "%$iFile%" find.EXE /c /v "" ^)'
) do set "$end=%%?"
echo.linefeeds[%$end%]
< "%$iFile%" (
for /l %%! in (
1, 1, %$end%
) do set "$=" &set /p "$=" &(
setlocal enabledelayedexpansion
rem (
(<nul set /p ="!$!!$lf!")
rem )
endlocal
)
) > "%$oFile%"
echo.
echo.'%$oFile%'
type "%$oFile%"
pause
exit
Code: Select all
@echo off &setlocal disableDelayedExpansion
set "$iFile=LFtoCRLF.TXT"
set "$oFile=ou.TXT"
(for /f ^"usebackqeol^=^
delims^=^" %%? in (
"%$iFile%"
) do (echo(%%?)
)> "%$oFile%"
echo.
echo.'%$oFile%'
type "%$oFile%"
pause
exit
Re: Convert CRLF to LF
Ed Dyreen wrote:LFtoCRLF is easy
For less than 65k lines, it is indeed.
Code: Select all
more a.htm >b.htm
Re: Convert CRLF to LF
Hi,
i'm running the fowlling script, but it return an empty file.
Any Help ?
i'm running the fowlling script, but it return an empty file.
Any Help ?
Code: Select all
@echo off &setlocal disableDelayedExpansion
set "$iFile=c:\TEMP\A.txt"
set "$oFile=c:\TEMP\B.txt"
set $lf=^
::
for /f %%? in (
'2^>nul ^( ^< "%$iFile%" find.EXE /c /v "" ^)'
) do set "$end=%%?"
echo.linefeeds[%$end%]
< "%$iFile%" (
for /l %%! in (
1, 1, %$end%
) do set "$=" &set /p "$=" &(
setlocal enabledelayedexpansion
rem (
(<nul set /p ="!$!!$lf!")
rem )
endlocal
)
) > "%$oFile%"
echo.
echo.'%$oFile%'
type "%$oFile%"
pause
exit
Re: Convert CRLF to LF
RMSoares wrote:i'm running the fowlling script, but it return an empty file.
Ed's code works nicely here. What is the contents of your c:\TEMP\A.txt file, and what is displayed in the console after you run the given code?
Liviu
Re: Convert CRLF to LF
Ed's code has the usual problem of removing blank lines.
If exact duplication of the file is required then this is best left to a dedicated utility, there are many to be found in google.
If exact duplication of the file is required then this is best left to a dedicated utility, there are many to be found in google.
Re: Convert CRLF to LF
foxidrive wrote:Ed's code has the usual problem of removing blank lines.
That one is fixable, just replace Ed's line with...
Code: Select all
rem (
if defined $ (<nul set /p ="!$!!$lf!") else (<nul set /p "=!$lf!")
rem )
foxidrive wrote:If exact duplication of the file is required then this is best left to a dedicated utility, there are many to be found in google.
Agreed. Batch solutions also have size limitation on the line length, drop control characters at the end of lines, and 'find /c' miscounts one less empty line at the end of the file.
Liviu
Re: Convert CRLF to LF
Liviu wrote:foxidrive wrote:Ed's code has the usual problem of removing blank lines.
That one is fixable, just replace Ed's line with...Code: Select all
rem (
if defined $ (<nul set /p ="!$!!$lf!") else (<nul set /p "=!$lf!")
rem )
It still drops blank lines, Liviu
Re: Convert CRLF to LF
foxidrive wrote:It still drops blank lines
That's odd. It certainly doesn't drop them here. With the one line change I posted, my test case gives...
Code: Select all
C:\tmp>type crlftolf.txt
line 2
line 5
"! % < " ( " > " ) ^ "
line 9
C:\tmp>crlftolf.cmd
linefeeds[9]
'ou.TXT'
line 2
line 5
"! % < " ( " > " ) ^ "
line 9
C:\tmp>
Just to be sure, did you paste the line literally? The "else" part has the opening quote placed before the "=" sign, and that's deliberate. Or maybe it's just an isolated quirk of my XP sp3.
Either way, the issue itself of dropping blank lines is on the output side. On the input side, blank lines are read in correctly. Only remaining problem is how to send a single LF character to the output stream. If (<nul set /p "=!$lf!") doesn't work reliably under all windows, then perhaps someone can come up with a better/universal alternative.
Liviu
Re: Convert CRLF to LF
Yes, (<nul set /p "=!$lf!") doesn't work in Windows 7.
I used this and it gave me the extra lines, but with the 'a'
(<nul set /p "=a!$lf!")
I used this and it gave me the extra lines, but with the 'a'
(<nul set /p "=a!$lf!")
Re: Convert CRLF to LF
foxidrive wrote:Yes, (<nul set /p "=!$lf!") doesn't work in Windows 7.
Indeed. Thanks for (re)pointing. Apparently, the behavior changed since Vista http://www.dostips.com/forum/viewtopic.php?p=16857#p16857.
For the case here it would be relatively straightforward to count/accumulate the empty lines and prepend the outstanding LFs to the next non-empty line. This would still miss any trailing empty lines at the end of the file, but that's unavoidable as long as no way is found to reliably emit single LFs.
Liviu
Re: Convert CRLF to LF
in.TXTfoxidrive wrote:Ed's code has the usual problem of removing blank lines.
Code: Select all
this[0A]^wo rks!
";Please <preserve=^"this line"!>"[0A][0A][0A][0A]This
^wo rks!
Code: Select all
@echo off &setlocal disableDelayedExpansion &title %~n0
set "$iFile=in.TXT"
set "$oFile=ou.TXT"
set $lf=^
::
for /f "delims=#" %%? in ( '"prompt #$H# &echo on &for %%b in (1) do rem"' ) do set "$BS=%%?"
echo.¯ '%$iFile%'
type "%$iFile%" &echo.
echo.® '%$iFile%'
for /f %%? in (
'2^>nul ^( ^< "%$iFile%" find.EXE /c /v "" ^)'
) do set "$end=%%?"
< "%$iFile%" (
for /l %%! in (
1, 1, %$end%
) do set "$=" &set /p "$=" &(
setlocal enabledelayedexpansion
rem ( <nul set /p ="_!$BS!!$!!$lf!" >&2
<nul set /p ="_!$BS!!$!!$lf!"
rem )
endlocal
)
) > "%$oFile%"
echo.
echo.¯ '%$oFile%'
type "%$oFile%" &echo.
echo.® '%$oFile%'
echo.linefeeds[%$end%]
pause
exit
Code: Select all
» 'in.TXT'
this
^wo rks!
";Please <preserve=^"this line"!>"
This
^wo rks!
« 'in.TXT'
» 'ou.TXT'
this
^wo rks!
";Please <preserve=^"this line"!>"
This
^wo rks!
« 'ou.TXT'
linefeeds[11]
Re: Convert CRLF to LF
Ed Dyreen wrote:in.TXTfoxidrive wrote:Ed's code has the usual problem of removing blank lines.
Sorry, but I don't follow. Running your example, the screen looks fine, but the saved ou.txt file has the literal BACKSPACE 0x08 embedded, which defeats the purpose here. As I see it, jeb's comment "this only works with display output, but not with file output" (http://www.dostips.com/forum/viewtopic.php?p=16857#p16857) still stands unanswered.
Liviu
Re: Convert CRLF to LF
[edit Aug 2012 13:34]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
in.TXT
ou.TXT
console
I've been fighting with the '(<nul set /p =!$!)' but it kept getting confused on the escape character inside '";Please <preserve=^"this line"!>"' even with the delayed expansion I just couldn't get it right on XP so, I ended up using '(echo(!$!)' but this required me to push over endlocal.
But then suddenly the '(<nul set /p =!$!)' works again
I copy entire code from this post and pasted to make sure you won't have problems with removed TABS. It didn't break luckily.
This amount of code, I know that's insane, it is based upon dBenhams safe return technique which is defined in disabled expansion, has low-coupling and is therefor much shorter. After all I only needed my Endlocal_ macro
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I didn't test it properly but it seem to work nowSorry, but I don't follow. Running your example, the screen looks fine, but the saved ou.txt file has the literal BACKSPACE 0x08 embedded, which defeats the purpose here. As I see it, jeb's comment "this only works with display output, but not with file output" (viewtopic.php?p=16857#p16857) still stands unanswered.
Liviu
in.TXT
Code: Select all
this[0A]^wo rks!
";Please <preserve=^"this line"!>"[0A][0A][0A][0A]This
^wo rks!
Code: Select all
this[0A]^wo rks![0A][0A][0A][0A]";Please <preserve=^"this line"!>"[0A][0A][0A][0A]This[0A]^wo rks!
Code: Select all
» 'in.TXT'
this
^wo rks!
";Please <preserve=^"this line"!>"
This
^wo rks!
« 'in.TXT'
» 'ou.TXT'
this
^wo rks!
";Please <preserve=^"this line"!>"
This
^wo rks!
« 'ou.TXT'
linefeeds[10]
Druk op een toets om door te gaan. . .
But then suddenly the '(<nul set /p =!$!)' works again
Code: Select all
@echo off &setlocal disableDelayedExpansion &title %~n0
set "$iFile=in.TXT"
set "$oFile=ou.TXT"
prompt $G &<nul set /p "= " &chcp 850 &color 0B %= prompt minimalistic, codepage 850, colorConsole =%
:: --------------------------------------------------------------------------------------------------------------------------
:: - %* callback script validation -
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 2012^08^08
:: (
set "$notDelayedFlag=!" %= persist over endlocal =%
:: )
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
echo. &echo. ¯ offDelayed definitions
:: --------------------------------------------------------------------------------------------------------------------------
setlocal disableDelayedExpansion
:: (
:: --------------------------------------------------------------------------------------------------------------------------
echo. &echo. ¯ echon_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: on channel 1: echo with LineFeed
:: (
%= =%set "echon_=echo("
:: )
echo. ® echon_ [ok:loaded]
::
( >con echo. &%echon_% This &%echon_%Works ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
%echon_% &%echon_% ¯ nechon_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
:: support : naDelayed
::
:: on channel 1: LineFeed, echo with LineFeed
:: (
%= =%set "nechon_=%echon_%&%echon_%"
:: )
%echon_% ® nechon_ [ok:loaded]
::
( %nechon_% This &%nechon_%Works ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%nechon_% ¯ echo_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: on channel 1: echo without LineFeed
:: (
%= =%set "echo_=<nul set/p="
:: )
%echon_% ® echo_ [ok:loaded]
::
( %echo_% This &%echo_% Works &echo. ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
%nechon_% ¯ necho_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
:: support : naDelayed
::
:: on channel 1: LineFeed then echo without LineFeed
:: (
%= =%set "necho_=%echon_%&%echo_%"
:: )
%necho_% ® necho_ [ok:loaded]
::
( %necho_% This &%necho_%Works &echo. ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%echon_% &%necho_% ¯ n2echo_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
:: support : naDelayed
::
:: on channel 1: 2 LineFeeds then echo without LineFeed
:: (
%= =%set "n2echo_=%echon_%&%necho_%"
:: )
%necho_% ® n2echo_ [ok:loaded]
::
( %n2echo_% This &%n2echo_% Works &echo. ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%n2echo_% ¯ n2echon_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
:: support : naDelayed
::
:: on channel 1: 2 LineFeeds, echo with LineFeed
:: (
%= =%set "n2echon_=%nechon_%&%echon_%"
:: )
%necho_% ® n2echon_ [ok:loaded]
::
( %n2echon_% This &%n2echon_%Works ) 2>nul
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%necho_% ¯ pre_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: (
%= =%set "pre_=%n2echo_% ¯"
:: )
%necho_% ® pre_ [ok:loaded]
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% post_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: (
%= =%set "post_=%necho_% ®"
:: )
%post_% post_ [ok:loaded]
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% $lf Asci-0x0A, LineFeed naDelayed
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 11/04/2012
::
:: The first set/p reads the first line, in this case the "@echo off".
:: The pause reads the next character, in this case the next line is empty, so it reads a <CR>.
:: The next set/p reads now the <LF> and the next line "<"%~f0" >nul (set/pLF=&pause&set/pLF=)"
:: (
setlocal enableDelayedExpansion
:: (
<"%~f0" >nul (set/p$lf=&pause&set/p$lf=)
:: )
for %%r in ( "!$lf:~0,1!" ) do endlocal &set "$lf=%%~r" &echo. &echo.This%%~rworks
:: )
%post_% $lf Asci-0x0A [ok:loaded]
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
echo.endoftest
pause
exit
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% endoftest
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 20/05/2012
:: support : naDelayed
::
:: on console; notify the end of a test, terminates script !
:: (
%= =%set "endoftest=(%necho_% endoftest &pause&exit 0)>con"
:: )
%post_% endoftest [ok:loaded]
::
goto :skip "()"
:: (
%endoftest%
:: )
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% $cr Ascii-0x0D, only for DelayedExpansion
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 13/07/2012
:: (
for /f %%? in ( 'copy /Z "%~f0" nul' ) do set "$cr=%%?"
:: )
%post_% $cr Ascii-0x0D, only for DelayedExpansion [ok:loaded]
::
setlocal enableDelayedExpansion &%nechon_% This!$cr! Works &endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% $n1c, newLine+continuation, 1 expansions, 0sets, 1echo
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
:: (
%= =%set ^"$n1c=^^^%$lf%%$lf%^%$lf%%$lf%^^"
:: )
%post_% $n1c, newLine+continuation, 1 expansions, 0sets, 1echo [ok:loaded]
::
%necho_%--this%$n1c%
works--
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% $n2c newLine+continuation, 2 expansions, 1sets, 1echo
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 08/03/2012
:: (
%= =%set ^"$n2c=^^^^^^^%$lf%%$lf%^%$lf%%$lf%^^^%$lf%%$lf%^%$lf%%$lf%^^"
:: )
%post_% $n2c newLine+continuation, 2 expansions, 1sets, 1echo [ok:loaded]
::
setlocal
:: (
set var=this%$n2c%
works
%nechon_% ---- &call %echo_% %%var%%
:: )
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% forC_, counter
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: loop token, counting
:: (
%= =%set "forC_=for /l %%! in"
:: )
%post_% forC_ [ok:loaded]
::
%n2echon_% %forC_%
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% forQ_, looper
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 31/01/2012
::
:: loop token, simple form
:: (
%= =%set "forQ_=for %%? in"
:: )
%post_% forQ_ [ok:loaded]
::
%n2echon_% %forQ_%
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% ForEntireLine
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 22/02/2012
:: support : naDelayed
:: (
%= =%set ^"forLineR_=for /f ^^^"eol^^=^^^%$lf%%$lf%^%$lf%%$lf%delims^^=^^^" %%r in"
%= =%set ^"mForLineR_=for /f ^^^^^^^"eol^^^^=^^^^^^^%$lf%%$lf%^%$lf%%$lf%^^^%$lf%%$lf%^%$lf%%$lf%delims^^^^=^^^^^^^" %%r in"
:: )
%post_% ForEntireLine
::
setlocal
:: (
%n2echo_% a for that always returns the entire line, 1 expansions, 0sets, 1echo
::
%necho_% forLineR_: &%forLineR_% ( ";Please <preserve=^"this line"!>" ) do %echo_% %%r
%n2echo_% a for that always returns the entire line, 2 expansions, 1sets, 1echo
::
set @MforLineR=%mForLineR_% ( ";Please <preserve=^"this line"!>" ) do %echon_% %%r
%necho_% @MforLineR: &%@MforLineR%
:: )
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% delim_, alphanumeric [a-z], delims [default delimiters]
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 2012^08^09
:: support : problematic chars: [!,",%,&,(,),<,=,>,?,^,|]
:: encoded chars : [*]
:: warn : variable's contents are used in the splitting process.
:: do not pass variables with malformatted content !
:: (
:: support : onDelayed, byVal¦eVal, delayedChars, paramless input
:: (
%= =%set ^"oMDelim_=%forQ_% (1,2) do if %%?==2 (%$n2c%
%= =%set $=!$:42#=4\2#!^^^&set $=!$:^^^"=""!%= pre-delay =%%$n2c%
%= =%set $=!$:\*=42#!^^^&set "$=!$:^=^^^^!"^^^&call set "$=%%^$:^!=#"#"^!%%"!%= delay 2-times =%%$n2c%
%= =%set "$=!$:#"#"=^^^!"^^^&set $=!$:""=^^^"!%= post-delay =%%$n2c%
%= =%set ?=^^^&%forQ_% (!$!) do set ?=!?!¦%%?%$n2c%
%= =%if +!?!==+ set ?=""%$n2c%
%= =%set ?=!?:42#=\*!^^^&set ?=!?:4\2#=42#!%$n2c%
%= =%)^^^&for /f "tokens=1-26delims=¦" %%a in ("!?!") do "
:: )
:: )
%post_% Delim_, alphanumeric [a-z], delims [default delimiters]
::
setlocal disableDelayedExpansion
:: (
set "$var=This\*^Works !"
setlocal disableDelayedExpansion
:: (
%= =% set ^"@macro_=%oMDelim_%(%$n1c%
%= =%echo.%$n1c%
%= =%echo. oMDelim_:%$n1c%
%= =%echo. a=%%~a=^^^!%%~a^^^!_%$n1c%
%= =%echo. b=%%~b=^^^!%%~b^^^!_%$n1c%
%= =%echo. c=%%~c=^^^!%%~c^^^!_%$n1c%
%= =%endlocal)else setlocal enableDelayedExpansion^&set $="
::
( %@macro_% $var, "This ^^Works ^!", "!$var!" )
:: )
endlocal
:: )
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% macroStart_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 2012^08^10
:: support : naDelayed
::
:: Retrieves current DelayedFlag needed by macroEnd and sets localscope.
:: (
%= =%set ^"macroStart_=%oMDelim_%(%$n1c%
%= =%(echo.^&if defined $notDelayedFlag (set/p=NotDelayed^<nul)else set/p=Delayed^<nul)^>^&2%$n1c%
%= =%if defined $details (set $fetch=, !$details!)else set $fetch=%$n1c%
%= =%echo.^&echo.^&set/p= ¯ !$defines!!$fetch!^<nul%$n1c%
%= =%endlocal^&set $details=^&setlocal %%~a%$n1c%
%= =%)else set $notDelayedFlag=!^&setlocal enableDelayedExpansion^&set $="
:: )
%post_% macroStart_
::
setlocal
:: (
set "$defines=@This_Works" &set "$details=Some detail"
( %macroStart_% enableDelayedExpansion ) &endlocal
( %macroStart_% "disableDelayedExpansion" ) &endlocal
:: )
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% endlocalR_
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 30/01/2012
:: support : onDelayed
:: style : dBenham's replace
::
:: push over endlocal using replace technique
:: (
%= =%set ^"endlocalR_=(set ^"$replace=%% ^" !$cr!!$cr!^"%$n1c%
%= =%)^&for /f "tokens=1-3" %%1 in ("!$replace!") do for %%4 in ("!$lf!") do endlocal^&endlocal^&"
:: )
%post_% endlocalR_
::
setlocal enabledelayedexpansion
:: (
setlocal &setlocal &%endlocalR_% set "$cr=%%3" !
::
%necho_% $cr failed !$cr! $cr succes
setlocal &setlocal
:: (
echo.
:: )
%endlocalR_% ( %= skip a line to max return size to 8k =%
::
set "$var=one=%%1_%%~4 two=%%2_" !
)
::
%necho_% !$var!
:: )
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% macroEnd
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 03/02/2012
:: support : naDelayed, $cr, $lf, theoretical max 8192, real max 8192-10, replacer practical max 8192-+-1965
:: style : dBenham's replace
::
:: Prepares $defined to be pushed over endlocal using immediate expansion + replace technique,
:: regardless the outer delayed setting
:: (
%= =%set ^"macroEnd=(setlocal enableDelayedExpansion%$n1c%
%= =%(echo.^&if defined $notDelayedFlag (set/p= NotDelayed^<nul)else set/p= Delayed^<nul)^>^&2%$n1c%
%= =%%forQ_% ("!$defines!") do set $=^&set $=!%%~?!^&^&(%$n1c%
%= =%(echo.^&set/p= ^<nul^&set %%~?)^>^&2%$n1c%
%= =%set $1=!$:~0,4096!^&set $2=!$:~4096!^&%forQ_% (1,2) do if defined $%%~? (%$n1c%
%= =%set $=!$%%~?!^&set $=!$:%%=%%1!^&set ^"$=!$:^"=%%2!^"%= Replace by injection=%%$n1c%
%= =%for %%r in ("!$cr!") do set $=!$:%%~r=%%3!%$n1c%
%= =%for %%r in ("!$lf!") do set $=!$:%%~r=%%~4!%$n1c%
%= =%if not defined $notDelayedFlag call set "$=%%^$:^!=""^!%%"!^&set "$=!$:^=^^!"^&set "$=!$:""=^!"%$n1c%
%= =%set $%%~?=!$!%$n1c%
%= =%)%$n1c%
%= =%)^|^|call :§endSimple "macroEnd, not defined: '!$defines!'"%$n1c%
%= =%set $=^&set $=set "!$defines!=!$1!!$2!"^!^|^|call :§endSimple "macroEnd, variable overflow: '!$defines!'"%$n1c%
%= =%(echo.^&set/p= !$!^<nul)^>^&2%$n1c%
%= =%echo.^&set/p"= ® !$defines! [ok:loaded]"^<nul%$n1c%
%= =%)"
:: )
%post_% macroEnd
:: (
setlocal enableDelayedExpansion &set "$defines=$8kVar"
:: (
%n2echo_% testing replacer practical max 8192-+-1965
2>nul ( %macroStart_% enableDelayedExpansion )
:: (
set "$8kVar=_##^^#"q"ex^!#%%1#_" %= 16 chars initially =%
for /l %%! in ( 1, 1, 11 ) do set "$8kVar=!$8kVar!!$8kVar!"
set "$8kVar=!$8kVar!!$8kVar:~0,-1965!"
:: )
%macroEnd%
%endlocalR_% (
%= =%%$%
)
%n2echo_% $8kVar=!$8kVar!_
:: )
endlocal
setlocal enableDelayedExpansion &set "$defines=$var"
:: (
2>nul ( %macroStart_% enableDelayedExpansion )
:: (
%= =%set ^"$var=(%$n1c%
%= =%echo. This "^^Works^!"%$n1c%
%= =%)else setlocal enableDelayedExpansion ^&set $="
:: )
2>nul %macroEnd%
%endlocalR_% (
%= =%%$%
)
::
%n2echo_% $var=!$var!_
:: )
endlocal
setlocal enableDelayedExpansion &set "$defines=$var"
:: (
2>nul ( %macroStart_% disableDelayedExpansion )
:: (
%= =%set "$var=echo. This "^^Works^!""
:: )
2>nul %macroEnd%
%endlocalR_% (
%= =%%$%
)
::
%n2echo_% $var=!$var!_
:: )
endlocal
:: )
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% advancedR
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 03/02/2012
:: support : naDelayed, $cr, $lf
:: style : dBenham's replace
::
:: Prepares multiple variables to be pushed over endlocal using immediate expansion, regardless the outer delayed setting
:: (
%= =%set ^"advancedR=%forQ_% (1,2) do if %%?==2 (%$n1c%
%= =%(echo.^&if defined $notDelayedFlag (set/p= NotDelayed^<nul)else set/p= Delayed^<nul)^>^&2%$n1c%
%= =%%forQ_% (!$!) do set $=^&set $=!%%~?!^&^&(%$n1c%
%= =%(echo.^&set/p= ^<nul^&set %%~?)^>^&2%$n1c%
%= =%set $1=!$:~0,4096!^&set $2=!$:~4096!^&%forQ_% (1,2) do if defined $%%~? (%$n1c%
%= =%set $=!$%%~?!^&set $=!$:%%=%%1!^&set ^"$=!$:^"=%%2!^"%= Replace by injection =%%$n1c%
%= =%for %%r in ("!$cr!") do set $=!$:%%~r=%%3!%$n1c%
%= =%for %%r in ("!$lf!") do set $=!$:%%~r=%%~4!%$n1c%
%= =%if not defined $notDelayedFlag call set "$=%%^$:^!=""^!%%"!^&set "$=!$:^=^^!"^&set "$=!$:""=^!"%$n1c%
%= =%set $%%~?=!$!%$n1c%
%= =%)%$n1c%
%= =%(set/p= #%%~?=set "%%~?=!$1!!$2!"^!^<nul)^>^&2%$n1c%
%= =%set #%%~?=^&set #%%~?=set "%%~?=!$1!!$2!"^!^|^|call :§endSimple "advancedR, variable overflow: '%%~?'"%$n1c%
%= =%)^|^|call :§endSimple "%%~?: not defined."%$n1c%
%= =%)else setlocal enableDelayedExpansion^&set $="
:: )
%post_% advancedR
:: (
setlocal enableDelayedExpansion &set "$notDelayedFlag=!"
:: (
set "$var="
setlocal enableDelayedExpansion
:: (
set "$var=This ^^works^!"
:: )
%advancedR% $var
endlocal &endlocal &%#$var%
echo. &<nul set/p"= " &set "$var"
set "$var="
setlocal disableDelayedExpansion
:: (
set "$var=This ^works!"
:: )
%advancedR% $var
endlocal &endlocal &%#$var%
echo. &<nul set/p"= " &set "$var"
:: )
endlocal
setlocal disableDelayedExpansion &set "$notDelayedFlag=!"
:: (
set "$var="
setlocal enableDelayedExpansion
:: (
set "$var=This ^^works^!"
:: )
%advancedR% $var
endlocal &endlocal &%#$var%
echo. &<nul set/p"= " &set "$var"
set "$var="
setlocal disableDelayedExpansion
:: (
set "$var=This ^works!"
:: )
%advancedR% $var
endlocal &endlocal &%#$var%
echo. &<nul set/p"= " &set "$var"
:: )
endlocal
setlocal enableDelayedExpansion &set "$defines=$var"
:: (
set "$var="
>nul 2>&1 ( %macroStart_% disableDelayedExpansion )
:: (
%= =%set "$var=echo. This "^^Works^!""
:: )
%advancedR% $var
%endlocalR_% (
%= =%%#$var%
)
::
%necho_% $var=!$var!_
:: )
endlocal
:: )
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: --------------------------------------------------------------------------------------------------------------------------
%pre_% Global return
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 30/01/2012
:: Warning : Using global $notDelayedFlag, make sure it is correct !
:: (
setlocal enableDelayedExpansion
:: (
%necho_% Globally called &if defined $notDelayedFlag (set/p=NotDelayed<nul)else set/p=Delayed<nul
%necho_% Building Index...
%= =%set $Index=^
%= =%,$lf^
%= =%,$cr^
%= =%,$n1c^
%= =%,$n2c^
%= =%,echo_^
%= =%,echon_^
%= =%,nechon_^
%= =%,necho_^
%= =%,n2echo_^
%= =%,pre_^
%= =%,post_^
%= =%,endoftest^
%= =%,forC_^
%= =%,forQ_^
%= =%,forLineR_^
%= =%,endlocalR_^
%= =%,macroStart_^
%= =%,macroEnd^
:: )
%necho_% Preparing involved variables for global return...
( %advancedR% !$Index! )
%endlocalR_% ( endlocal %= skip a line to max return size to 8k =%
::
%= =%%#$lf%
%= =%%#$cr%
%= =%%#$n1c%
%= =%%#$n2c%
%= =%%#echo_%
%= =%%#echon_%
%= =%%#necho_%
%= =%%#nechon_%
%= =%%#n2echo_%
%= =%%#pre_%
%= =%%#post_%
%= =%%#endoftest%
%= =%%#forC_%
%= =%%#forQ_%
%= =%%#forLineR_%
%= =%%#endlocalR_%
%= =%%#macroStart_%
%= =%%#macroEnd%
)
:: )
%post_% Global return
:: (
%n2echo_% Global $cr verification...
setlocal enableDelayedExpansion &set "$defines=$var"
:: (
2>nul ( %macroStart_% enableDelayedExpansion )
:: (
%= =%set ^"$var=(%$n1c%
%= =%!n2echo_! $cr failed ^^^!$cr^^^! $cr succes%$n1c%
%= =%)"
:: )
%macroEnd%
%endlocalR_% (
%= =%%$%
)
::
%$var%
:: )
endlocal
:: )
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
:skip ()
:: )
%post_% offDelayed definitions
:: --------------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------------
set "$defines=endlocal_"
:: --------------------------------------------------------------------------------------------------------------------------
:: last updated : 09/04/2012
:: support : naDelayed, no ( $cr, $lf ), ( encoded or regular escaped * )
:: Warn : for efficiency, the number of endlocals is controlled by global $eCount !
::
set ^"$usage.%$defines%=^
use: ( %%endlocal_%% #eCount, #var, #etc.. )%$n1c%
err: Unaffected, panic otherwise"
::
2>nul ( %macroStart_% enableDelayedExpansion )
:: (
%= =%set ^"!$defines!=!forQ_! (1,2) do if %%?==2 (%$n1c%
%= =%set/a$eCount+=1^&if ^^^!$eCount^^^! lss 2 set $eCount=2%$n1c%
%= =%set $=^&!forQ_! (^^^!?^^^!) do (set ?=^^^!%%~?^^^!^&if defined ? set ?=^^^!?:34#=3\4#^^^!%$n1c%
%= =%set $=^^^!$^^^!,34#%%~?=^^^!?^^^!34#%$n1c%
%= =%)%$n1c%
%= =%set $=^^^!$:^^^"=""^^^!%= inner delay =%%$n1c%
%= =%set $=^^^!$:^^^"=34#^^^!%$n1c%
%= =%set $=^^^!$:42=4\2^^^!^&set $=^^^!$:\*=42^^^!%= encode 42 =%%$n1c%
%= =%set $=^^^!$:94#=9\4#^^^!^&set "$=^!$:^^^=94#^!"^&set $=^^^!$:33#=3\3#^^^!^&call set "$=%%^^^$:^^^!=33#%%"^^^!^&set $=^^^!$:34#=^^^"^^^!%$n1c%
%= =%set $=^^^!$:3\4#=34#^^^!^&set $=^^^!$:63=6/3^^^!^&set $=^^^!$:?=63^^^!%= replace 63-? =%%$n1c%
%= =%for /f "delims=" %%r in ("^!$^!") do (!forC_! (1,1,^^^!$eCount^^^!) do endlocal%$n1c%
%= =%set ?=^^^!^&!forQ_! (%%r) do (setlocal enableDelayedExpansion%= outer delay =%%$n1c%
%= =%set $=%%~?^&set $=^^^!$:42=*^^^!^&set $=^^^!$:4\2=42^^^!%= decode 42 =%%$n1c%
%= =%set $=^^^!$:63=?^^^!^&set $=^^^!$:6/3=63^^^!^&call set "$=%%^^^$:33#=33#^^^!%%"^^^!%$n1c%
%= =%if defined ? (set "$=^!$:94#=^^^!"^&set $=^^^!$:33#=^^^!)else set "$=^!$:94#=^^^^^!"^&set "$=^!$:33#=^^^!"%$n1c%
%= =%set $=^^^!$:9\4#=94#^^^!^&set $=^^^!$:3\3#=33#^^^!^&set $=^^^!$:""=^^^"^^^!%$n1c%
%= =%!forLineR_! ("^!$^!") do endlocal^&set "%%r"%$n1c%
%= =%)%$n1c%
%= =%)%$n1c%
%= =%)else setlocal enableDelayedExpansion^&set ?="
:: )
2>nul %macroEnd%
%endlocalR_% (
%$%
)
setlocal disableDelayedExpansion
:: (
setlocal enableDelayedExpansion
:: (
set "$var0=simple"
set "$var1=\*\*\*\*\*\*"
%necho#$_% $var0, $var1
:: )
%endlocal_% $var0, $var0, $var1
%necho_% $var0=%$var0%_
%necho_% $var1=%$var1%_
set "$var=This ^Wo" rks !"
setlocal
:: (
setlocal enableDelayedExpansion &%n2echo_% $var=!$var!_ &endlocal
setlocal disableDelayedExpansion
:: (
set "$verify=failed"
:: )
%endlocal_% $var
2>nul set "$verify" &&%endoftest%
setlocal enableDelayedExpansion &%necho_% $var=!$var!_ &endlocal
::)
endlocal
setlocal
:: (
setlocal enableDelayedExpansion &%n2echo_% $var=!$var!_ &endlocal
setlocal enableDelayedExpansion
:: (
set "$verify=failed"
:: )
%endlocal_% $var
2>nul set "$verify" &&%endoftest%
setlocal enableDelayedExpansion &%necho_% $var=!$var!_ &endlocal
::)
endlocal
::)
endlocal
:: --------------------------------------------------------------------------------------------------------------------------
::
goto :skip "()"
%endoftest%
!necho_!?=^^^!?^^^!_%$n1c%
!necho_!$=^^^!$^^^!_%$n1c%
!necho_!r=%%r_%$n1c%
:skip ()
cls
echo.¯ '%$iFile%'
type "%$iFile%" &echo.
echo.® '%$iFile%'
more "%$iFile%" > "tmp.TXT"
for /f %%? in ( '2^>nul ^( ^< "%$iFile%" find.EXE /c /v "" ^)' ) do set "$end=%%?"
< "tmp.TXT" (
set "c=" &%forC_% (
1, 1, %$end%
) do set "$=" &set /p "$=" &(
set /a c += 1
setlocal enabledelayedexpansion
rem (
set "$i!c!=!$!"
rem )
%endlocal_% $i!c!
)
setlocal enabledelayedexpansion
rem (
set "$=" &%forC_% (
1,1,!c!
) do %forQ_% (
"i%%~!"
) do set "$=!$!!$%%~?!!$lf!"
(<nul set /p =!$:~0,-1!)
rem )
endlocal
) > "%$oFile%"
set /a $end -= 1
echo.
echo.¯ '%$oFile%'
type "%$oFile%" &echo.
echo.® '%$oFile%'
echo.linefeeds[%$end%]
pause
exit
This amount of code, I know that's insane, it is based upon dBenhams safe return technique which is defined in disabled expansion, has low-coupling and is therefor much shorter. After all I only needed my Endlocal_ macro