Is there a way of specifying multiline strings in batch in a way similar to heredoc in unix shells. Something similar to:
cat <<EOF > out.txt
bla
bla
..
EOF
The idea is to create a customized file from a template file..
Is there a way of specifying multiline strings in batch in a way similar to heredoc in unix shells. Something similar to:
cat <<EOF > out.txt
bla
bla
..
EOF
The idea is to create a customized file from a template file..
Not as far as I know.
The closest I know of is
> out.txt (
@echo.bla
@echo.bla
...
)
(@
prevents the command shell itself from printing the commands it\'s running, and echo.
allows you to start a line with a space.)
Here\'s another approach.
@echo off
:: ######################################################
:: ## Heredoc syntax: ##
:: ## call :heredoc uniqueIDX [>outfile] && goto label ##
:: ## contents ##
:: ## contents ##
:: ## contents ##
:: ## etc. ##
:: ## :label ##
:: ## ##
:: ## Notes: ##
:: ## Variables to be evaluated within the heredoc ##
:: ## should be called in the delayed expansion style ##
:: ## (!var! rather than %var%, for instance). ##
:: ## ##
:: ## Literal exclamation marks (!) and carats (^) ##
:: ## must be escaped with a carat (^). ##
:: ######################################################
:--------------------------------------------
: calling heredoc with results sent to stdout
:--------------------------------------------
call :heredoc stickman && goto next1
\\o/
| This is the \"stickman\" heredoc, echoed to stdout.
/ \\
:next1
:-----------------------------------------------------------------
: calling heredoc containing vars with results sent to a text file
:-----------------------------------------------------------------
set bodyText=Hello world!
set lipsum=Lorem ipsum dolor sit amet, consectetur adipiscing elit.
call :heredoc html >out.txt && goto next2
<html lang=\"en\">
<body>
<h3>!bodyText!</h3>
<p>!lipsum!</p>
</body>
</html>
Thus endeth the heredoc. :)
:next2
echo;
echo Does the redirect to a file work? Press any key to type out.txt and find out.
echo;
pause>NUL
type out.txt
del out.txt
:: End of main script
goto :EOF
:: ########################################
:: ## Here\'s the heredoc processing code ##
:: ########################################
:heredoc <uniqueIDX>
setlocal enabledelayedexpansion
set go=
for /f \"delims=\" %%A in (\'findstr /n \"^\" \"%~f0\"\') do (
set \"line=%%A\" && set \"line=!line:*:=!\"
if defined go (if #!line:~1!==#!go::=! (goto :EOF) else echo(!line!)
if \"!line:~0,13!\"==\"call :heredoc\" (
for /f \"tokens=3 delims=>^ \" %%i in (\"!line!\") do (
if #%%i==#%1 (
for /f \"tokens=2 delims=&\" %%I in (\"!line!\") do (
for /f \"tokens=2\" %%x in (\"%%I\") do set \"go=%%x\"
)
)
)
)
)
goto :EOF
Example output:
C:\\Users\\oithelp\\Desktop>heredoc
\\o/
| This is the \"stickman\" heredoc, echoed to stdout.
/ \\
Does the redirect to a file work? Press any key to type out.txt and find out.
<html lang=\"en\">
<body>
<h3>Hello world!</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</body>
</html>
Thus endeth the heredoc. :)
Yes, very possible. ^ is the literal escape character, just put it before your newline. In this example, I put the additional newline in as well so that it is properly printed in the file:
@echo off
echo foo ^
this is ^
a multiline ^
echo > out.txt
Output:
E:\\>type out.txt
foo
this is
a multiline
echo
E:\\>
@echo off
for /f \"delims=:\" %%a in (
\'findstr -n \"^___\" %0\') do set \"Line=%%a\"
(for /f \"skip=%Line% tokens=* eol=_\" %%a in (
\'type %0\') do echo(%%a) > out.html
:: out.html
pause
goto: EOF
___DATA___
<!Doctype html>
<html>
<head>
title></title>
</head>
<body>
<svg width=\"900\" height=\"600\">
<text x=\"230\"
y=\"150\"
font-size=\"100\"
fill=\"blue\"
stroke=\"gray\"
stroke-width=\"1\">
Hello World
</text>
</svg>
</body>
</html>
Over at DosTips, siberia-man posted a demonstration of amazing behavior of an erroneous GOTO statement in the form of (goto) 2>nul
. Aacini and jeb then documented some additional interesting discoveries about the odd behavior. It basically behaves like an EXIT /B
, except it allows concatenated commands within a CALLed routine to execute in the context of the parent caller.
Here is a brief script that demonstrates most of the salient points:
@echo off
setlocal enableDelayedExpansion
set \"var=Parent Value\"
(
call :test
echo This and the following line are not executed
exit /b
)
:break
echo How did I get here^^!^^!^^!^^!
exit /b
:test
setlocal disableDelayedExpansion
set \"var=Child Value\"
(goto) 2>nul & echo var=!var! & goto :break
echo This line is not executed
:break
echo This line is not executed
-- OUTPUT --
var=Parent Value
How did I get here!!!!
This amazing behavior has enabled me to write an elegant batch emulation of a here doc with many of the options available to unix. I implemented PrintHere.bat as a stand-alone utility that should be placed in a folder listed within your PATH. Then any batch script can easily CALL the utility to get here doc functionality.
Here is the general syntax of usage:
call PrintHere :Label
Here doc text goes here
:Label
How can this possibly be achieved?... My PrintHere utility uses the (GOTO) 2>nul
trick twice.
The first time I use (GOTO) 2>nul
to return to the caller so I can get the full path to the calling script so that PrintHere knows what file to read from. I then CALL PrintHere a second time!
The second time I use (GOTO) 2>nul
to return to the caller and GOTO the terminating label so that the here doc text is not executed.
Note - the script below contains a tab character (0x09) in the definition of tab, directly below the :start
label. Some browsers may have difficulty displaying and copying the tab. As an alternative, you can download PrintHere.bat.txt from my dropbox, and simply rename it to PrintHere.bat.
I originally posted PrintHere.bat at DosTips, where you can track future development.
PrintHere.bat
@echo off & setlocal disableDelayedExpansion & goto :start
::PrintHere.bat version 1.1 by Dave Benham
:::
:::call PrintHere [/E] [/- \"TrimList\"] :Label [\"%~f0\"]
:::call PrintHere [/E] [/- \"TrimList\"] :Label \"%~f0\" | someCommand & goto :Label
:::PrintHere /?
:::PrintHere /V
:::
::: PrintHere.bat provides functionality similar to the unix here doc feature.
::: It prints all content between the CALL PrintHere :Label line and the
::: terminating :Label. The :Label must be a valid label supported by GOTO, with
::: the additional constraint that it not contain *. Lines are printed verbatim,
::: with the following exceptions and limitations:
:::
::: - Lines are lmited to 1021 bytes long
::: - Trailing control characters are stripped from each line
:::
::: The code should look something like the following:
:::
::: call PrintHere :Label
::: Spacing and blank lines are preserved
:::
::: Special characters like & < > | ^ ! % are printed normally
::: :Label
:::
::: If the /E option is used, then variables between exclamation points are
::: expanded, and ! and ^ literals must be escaped as ^! and ^^. The limitations
::: are different when /E is used:
:::
::: - Lines are limited to ~8191 bytes long
::: - All characters are preserved, except !variables! are expanded and ^! and
::: ^^ are transformed into ! and ^
:::
::: Here is an example using /E:
:::
::: call PrintHere /E :SubstituteExample
::: Hello !username!^!
::: :SubstituteExample
:::
::: If the /- \"TrimList\" option is used, then leading \"TrimList\" characters
::: are trimmed from the output. The trim characters are case sensitive, and
::: cannot include a quote. If \"TrimList\" includes a space, then it must
::: be the last character in the list.
:::
::: Multiple PrintHere blocks may be defined within one script, but each
::: :Label must be unique within the file.
:::
::: PrintHere must not be used within a parenthesized code block.
:::
::: Scripts that use PrintHere must use \\r\\n for line termination, and all lines
::: output by PrintHere will be terminated by \\r\\n.
:::
::: All redirection associated with a PrintHere must appear at the end of the
::: command. Also, the CALL can include path information:
:::
::: call \"c:\\utilities\\PrintHere.bat\" :MyBlock>test.txt
::: This line is written to test.txt
::: :MyBlock
:::
::: PrintHere may be used with a pipe, but only on the left side, and only
::: if the source script is included as a 2nd argument, and the right side must
::: explicitly and unconditionally GOTO the terminating :Label.
:::
::: call PrintHere :PipedBlock \"%~f0\" | more & goto :PipedBlock
::: text goes here
::: :PipedBlock
:::
::: Commands concatenated after PrintHere are ignored. For example:
:::
::: call PrintHere :ignoreConcatenatedCommands & echo This ECHO is ignored
::: text goes here
::: :ignoreConcatenatedCommands
:::
::: PrintHere uses FINDSTR to locate the text block by looking for the
::: CALL PRINTHERE :LABEL line. The search string length is severely limited
::: on XP. To minimize the risk of PrintHere failure when running on XP, it is
::: recommended that PrintHere.bat be placed in a folder included within PATH
::: so that the utility can be called without path information.
:::
::: PrintHere /? prints out this documentation.
:::
::: PrintHere /V prints out the version information
:::
::: PrintHere.bat was written by Dave Benham. Devlopment history may be traced at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=6537
:::
:start
set \"tab= \" NOTE: This value must be a single tab (0x09), not one or more spaces
set \"sp=[ %tab%=,;]\"
set \"sp+=%sp%%sp%*\"
set \"opt=\"
set \"/E=\"
set \"/-=\"
:getOptions
if \"%~1\" equ \"\" call :exitErr Invalid call to PrintHere - Missing :Label argument
if \"%~1\" equ \"/?\" (
for /f \"tokens=* delims=:\" %%L in (\'findstr \"^:::\" \"%~f0\"\') do echo(%%L
exit /b 0
)
if /i \"%~1\" equ \"/V\" (
for /f \"tokens=* delims=:\" %%L in (\'findstr /rc:\"^::PrintHere\\.bat version\" \"%~f0\"\') do echo(%%L
exit /b 0
)
if /i %1 equ /E (
set \"/E=1\"
set \"opt=%sp+%.*\"
shift /1
goto :getOptions
)
if /i %1 equ /- (
set \"/-=%~2\"
set \"opt=%sp+%.*\"
shift /1
shift /1
goto :getOptions
)
echo %1|findstr \"^:[^:]\" >nul || call :exitErr Invalid PrintHere :Label
if \"%~2\" equ \"\" (
(goto) 2>nul
setlocal enableDelayedExpansion
if \"!!\" equ \"\" (
endlocal
call %0 %* \"%%~f0\"
) else (
>&2 echo ERROR: PrintHere must be used within a batch script.
(call)
)
)
set ^\"call=%0^\"
set ^\"label=%1^\"
set \"src=%~2\"
setlocal enableDelayedExpansion
set \"call=!call:\\=[\\\\]!\"
set \"label=!label:\\=[\\\\]!\"
for %%C in (. [ $ ^^ ^\") do (
set \"call=!call:%%C=\\%%C!\"
set \"label=!label:%%C=\\%%C!\"
)
set \"search=!sp!*call!sp+!!call!!opt!!sp+!!label!\"
set \"cnt=\"
for /f \"delims=:\" %%N in (\'findstr /brinc:\"!search!$\" /c:\"!search![<>|&!sp:~1!\" \"!src!\"\') do if not defined skip set \"skip=%%N\"
if not defined skip call :exitErr Unable to locate CALL PrintHere %1
for /f \"delims=:\" %%N in (\'findstr /brinc:\"!sp!*!label!$\" /c:\"!sp!*!label!!sp!\" \"!src!\"\') do if %%N gtr %skip% if not defined cnt set /a cnt=%%N-skip-1
if not defined cnt call :exitErr PrintHere end label %1 not found
if defined /E (
for /f \"skip=%skip% delims=\" %%L in (\'findstr /n \"^^\" \"!src!\"\') do (
if !cnt! leq 0 goto :break
set \"ln=%%L\"
if not defined /- (echo(!ln:*:=!) else for /f \"tokens=1* delims=%/-%\" %%A in (^\"\"%/-%!ln:*:=!\") do (
setlocal disableDelayedExpansion
echo(%%B
endlocal
)
set /a cnt-=1
)
) else (
for /l %%N in (1 1 %skip%) do set /p \"ln=\"
for /l %%N in (1 1 %cnt%) do (
set \"ln=\"
set /p \"ln=\"
if not defined /- (echo(!ln!) else for /f \"tokens=1* delims=%/-%\" %%A in (^\"\"%/-%!ln!\") do (
setlocal disableDelayedExpansion
echo(%%B
endlocal
)
)
) <\"!src!\"
:break
(goto) 2>nul & goto %~1
:exitErr
>&2 echo ERROR: %*
(goto) 2>nul & exit /b 1
Full documentation is embedded within the script. Below are some demonstrations of usage:
Verbatim output
@echo off
call PrintHere :verbatim
Hello !username!^!
It is !time! on !date!.
:verbatim
-- OUTPUT --
Hello !username!^!
It is !time! on !date!.
Expand variables (delayed expansion need not be enabled)
@echo off
call PrintHere /E :Expand
Hello !username!^!
It is !time! on !date!.
:Expand
--OUTPUT--
Hello Dave!
It is 20:08:15.35 on Fri 07/03/2015.
Expand variables and trim leading spaces
@echo off
call PrintHere /E /- \" \" :Expand
Hello !username!^!
It is !time! on !date!.
:Expand
--OUTPUT--
Hello Dave!
It is 20:10:46.09 on Fri 07/03/2015.
Output can be redirected to a file
@echo off
call PrintHere :label >helloWorld.bat
@echo Hello world!
:label
The output cannot be redirected as input, but it can be piped! Unfortunately, the syntax is not nearly as elegant because both sides of a pipe are executed in a new CMD.EXE process, so (GOTO) 2>nul
returns to a child cmd process, and not the master script.
@echo off
call PrintHere :label \"%~f0\" | findstr \"^\" & goto :label
Text content goes here
:label
The usage of a macro with parameters allows to write a \"heredoc\" in a simpler way:
@echo off
rem Definition of heredoc macro
setlocal DisableDelayedExpansion
set LF=^
::Above 2 blank lines are required - do not remove
set ^\"\\n=^^^%LF%%LF%^%LF%%LF%^^\"
set heredoc=for %%n in (1 2) do if %%n==2 (%\\n%
for /F \"tokens=1,2\" %%a in (\"!argv!\") do (%\\n%
if \"%%b\" equ \"\" (call :heredoc %%a) else call :heredoc %%a^>%%b%\\n%
endlocal ^& goto %%a%\\n%
)%\\n%
) else setlocal EnableDelayedExpansion ^& set argv=
rem Heredoc syntax:
rem
rem %%heredoc%% :uniqueLabel [outfile]
rem contents
rem contents
rem ...
rem :uniqueLabel
rem
rem Same notes of rojo\'s answer apply
rem Example borrowed from rojo\'s answer:
set bodyText=Hello world!
set lipsum=Lorem ipsum dolor sit amet, consectetur adipiscing elit.
%heredoc% :endHtml out.txt
<html lang=\"en\">
<body>
<h3>!bodyText!</h3>
<p>!lipsum!</p>
</body>
</html>
:endHtml
echo File created:
type out.txt
del out.txt
goto :EOF
rem Definition of heredoc subroutine
:heredoc label
set \"skip=\"
for /F \"delims=:\" %%a in (\'findstr /N \"%1\" \"%~F0\"\') do (
if not defined skip (set skip=%%a) else set /A lines=%%a-skip-1
)
for /F \"skip=%skip% delims=\" %%a in (\'findstr /N \"^\" \"%~F0\"\') do (
set \"line=%%a\"
echo(!line:*:=!
set /A lines-=1
if !lines! == 0 exit /B
)
exit /B
@jeb
setlocal EnableDelayedExpansion
set LF=^
REM Two empty lines are required
another variant:
@echo off
:)
setlocal enabledelayedexpansion
>nul,(pause&set /p LF=&pause&set /p LF=)<%0
set LF=!LF:~0,1!
echo 1!LF!2!LF!3
pause
Referring to rojo\'s post at https://stackoverflow.com/a/15032476/3627676
Definitely, his solution is what I am seeking for few time (of course, I could try to implement something similar to this but laziness moves progress :)). One thing I\'d like to add is a minor improvement to the original code. I thought it would be better if redirection to file was written at the end of the line. In this case the heredoc starter line could be stricter and its analysis simpler.
@echo off
set \"hello=Hello world!\"
set \"lorem=Lorem ipsum dolor sit amet, consectetur adipiscing elit.\"
call :heredoc HTML & goto :HTML
<html>
<title>!hello!</title>
<body>
<p>Variables in heredoc should be surrounded by the exclamation mark (^!).</p>
<p>!lorem!</p>
<p>Exclamation mark (^!) and caret (^^) MUST be escaped with a caret (^^).</p>
</body>
</html>
:HTML
goto :EOF
:: https://stackoverflow.com/a/15032476/3627676
:heredoc LABEL
setlocal enabledelayedexpansion
set go=
for /f \"delims=\" %%A in ( \'
findstr /n \"^\" \"%~f0\"
\' ) do (
set \"line=%%A\"
set \"line=!line:*:=!\"
if defined go (
if /i \"!line!\" == \"!go!\" goto :EOF
echo:!line!
) else (
rem delims are ( ) > & | TAB , ; = SPACE
for /f \"tokens=1-3 delims=()>&| ,;= \" %%i in ( \"!line!\" ) do (
if /i \"%%i %%j %%k\" == \"call :heredoc %1\" (
set \"go=%%k\"
if not \"!go:~0,1!\" == \":\" set \"go=:!go!\"
)
)
)
)
goto :EOF
What am I suggesting by this code? Let\'s consider.
Rojo\'s code is very strict:
call
and :heredoc
call :heredoc
is sticky to the edge of the line (no any whitespaces allowed at the beginning of the line) Things I am suggesting:
Update 1: Improvements to checking and performing of the heredoc beginning:
call :heredoc LABEL
or call :heredoc :LABEL
. So after printing the heredoc content it is possible to jump to another label, end of script or run exit /b
. Update 2:
for
are (
)
>
&
|
TAB
,
;
=
SPACE
/I
added to if
Update 3:
By the following link you can find the full version of the standalone script (embedding in your scripts is available) https://github.com/ildar-shaimordanov/tea-set/blob/master/bin/heredoc.bat
You can create a quoted block of text with a FOR /F loop, so you didn\'t need to escape special characters like <>|&
only %
have to be escaped.
This is sometimes usefull like creating a html output.
@echo off
setlocal EnableDelayedExpansion
set LF=^
REM Two empty lines are required
set ^\"NL=^^^%LF%%LF%^%LF%%LF%^^\"
for /F \"tokens=* delims=_\" %%a in (^\"%NL%
___\"One<>&|\"%NL%
___\"two 100%%\"%NL%
___%NL%
___\"three \"quoted\" \"%NL%
___\"four\"%NL%
\") DO (
@echo(%%~a
)
Output
One<>&|
two 100%
three \"quoted\"
four
I try to explain the code.
The LF variable contains one newline character, the NL variable contains ^<LF><LF>^
.
This can be used with the percent expansion to place ONE newline character and one caret at the line end.
Normally a FOR /F split a quoted text into multiple tokens, but only once.
As I insert newline characters the FOR-loop also splits into multiple lines.
The quote at the first and at the last line are only to create the correct syntax for the FOR-loop.
At the front of any line are _
as the first character will be escaped from the multi line caret of the previous line, and if the quote is the first character it looses the escape capability.
The _
delims is used, as spaces or commas causes problems with XP (Else the XP-Bug spurious tries to access garbage filenames).
The caret at the line end is also only against the XP-Bug.
The XP-Bug comes in effect when a quoted text contains unquoted ,;=<space>
characters
for /f \"tokens=*\" %%a in (\"a\",\"b\",\"c\") do echo %%a
@echo off
cls
title Drop Bomb
echo/
echo/ creating...
:: Creating a batchfile from within a batchfile.
echo @echo off > boom.bat
echo cls >> boom.bat
echo color F0 >> boom.bat
echo echo/ >> boom.bat
echo echo --- B-O-O-M !!! --- >> boom.bat
echo echo/ >> boom.bat
echo pause >> boom.bat
echo exit >> boom.bat
:: Now lets set it off
start boom.bat
title That hurt my ears.
cls
echo/
echo - now look what you\'ve done!
pause
In a Microsoft NMake makefile one can use true UNIX heredocs, as the thread owner requested them. For example, this is an explicit rule to create a file Deploy.sed:
Deploy.sed:
type << >$@
; -*-ini-generic-*-
;
; Deploy.sed -- Self-Extracting Directives
;
[Version]
Class=IEXPRESS
SEDVersion=3
.
.
[Strings]
InstallPrompt=Install $(NAME)-$(VERSION).xll to your personal XLSTART directory?
DisplayLicense=H:\\prj\\prog\\XLL\\$(NAME)\\README.txt
.
.
<<
clean:
-erase /Q Deploy.sed
where << expands into a temporary filename NMake creates on the fly when executing the rule. That is, when Deploy.sed does not exist. The nice thing is that NMake variables are expanded too (here the variables NAME and VERSION). Save this as makefile. Open a DOS-box in the directory of makefile and use:
> nmake Deploy.sed
to create the file, and:
> nmake clean
to remove it. NMake is part of all versions of Visual Studio C++, including the Express-editions.
Expanding on ephemient post, which I feel is the best, the following will do a pipe:
(
@echo.line1
@echo.line2 %time% %os%
@echo.
@echo.line4
) | more
In ephemient\'s post he redirected at the beginning, which is a nice style, but you can also redirect at the end as such:
(
@echo.line1
@echo.line2 %time% %os%
@echo.
@echo.line4
) >C:\\Temp\\test.txt
Note that \"@echo.\" is never included in the output and \"@echo.\" by itself gives a blank line.
This is even easier, and closely resembles cat << EOF > out.txt:
C:\\>copy con out.txt
This is my first line of text.
This is my last line of text.
^Z
1 file(s) copied.
Output looks like this:
C:\\>type out.txt
This is my first line of text.
This is my last line of text.
(copy con + out.txt, type your input, followed by Ctrl-Z and file is copied)
COPY CON means \"copy from the console\" (accept user input)
What the OP wanted was something very specific (creating a text file with the output) and the accepted answer does that perfectly, but the solution presented does not work well outside of that specific context. For example, if I want to pass multi-line input into a command, I can\'t use the ( echo )
syntax. Here\'s what wound up working for me.
Given a perl script named \"echolines.pl\" consisting of the following (to simulate a \'real\' program):
use strict;
use warnings;
while (<>) {
chomp;
print qq(<$_>\\n);
}
and a batch file named \"testme.bat\" containing:
@echo off
set FOO=foo
set BAR=bar
set BAZ=baz
echo %FOO%^
&echo %BAR%^
&echo %BAZ%|perl echolines.pl
running it produces the expected output:
C:\\>testme
<foo>
<bar>
<baz>
Care with whitespace must be taken to ensure it all works correctly with no stray spaces anywhere. Specifically: each end-of-line should be a caret (^) followed by a newline, the subsequent lines must begin immediately with the ampersand (&) and the last line must have the pipe starting immediately after the last item to be sent. Failing to do this will result in missing parameters or extra whitespace before and after the parameters.
Try this code. (JScript code at the bottom writes \"out.html\" to disk)
@if(0)==(0) echo on
cscript.exe //nologo //E:JScript \"%~f0\" source1 out.html
start out.html
goto :EOF
[source1]
<!DOCTYPE html>
<html>
<head>
title></title>
</head>
<body>
<svg width=\"900\" height=\"600\">
<text x=\"230\"
y=\"150\"
font-size=\"100\"
fill=\"blue\"
stroke=\"gray\"
stroke-width=\"1\">
Hello World
</text>
</svg>
</body>
</html>
[/source1]
@end
if (WScript.Arguments.length != 2) WScript.Quit();
var tagName = WScript.Arguments(0);
var path = WScript.Arguments(1);
var startTag = \"[\" + tagName + \"]\"
var endTag = \"[/\" + tagName + \"]\"
var fso = new ActiveXObject(\"Scripting.FileSystemObject\");
var file1 = fso.OpenTextFile(WScript.ScriptFullName);
var txt = \"\";
var found = false;
while (!file1.AtEndOfStream) {
var line = file1.ReadLine();
if (!found) {
if (line.lastIndexOf(startTag, 0) === 0) found = true;
} else {
if (line.lastIndexOf(endTag, 0) === 0) break;
txt += line + \"\\n\";
}
}
file1.Close();
var file2 = fso.CreateTextFile(path, true, false);
file2.Write(txt);
file2.Close();
Here\'s a variant of ephemient\'s excellent solution. This allows you to pipe multiple lines into another program without actually creating a text file and input redirecting it to your program:
(@echo.bla
@echo.bla
) | yourprog.exe
For a quick, working example, you can replace yourprog.exe
with more
:
(@echo.bla
@echo.bla
) | more
Output:
bla
bla
C:\\>more >file.txt
This is line 1 of file
This is line 2 of file
^C
C:\\>type file.txt
This is line 1 of file
This is line 2 of file
**It will add an empty line at the end, but you can solve that easily, just by using the copy con method:
C:\\>copy con file.txt >nul
This is line 1 of file
This is line 2 of file^Z
C:\\>type file.txt
This is line 1 of file
This is line 2 of file
Beware where you type ^C and ^Z in each case.