heredoc pour Windows batch?
est-il possible de spécifier des chaînes multilignes en lot d'une manière similaire à heredoc dans les shells unix. Quelque chose comme:
cat <<EOF > out.txt
bla
bla
..
EOF
L'idée est de créer un fichier personnalisé à partir d'un fichier de modèle..
17 réponses
pas autant que je sache.
Le plus proche que je connaisse est
> out.txt (
@echo.bla
@echo.bla
...
)
( @
empêche le shell de commande lui-même d'imprimer les commandes qu'il exécute, et echo.
vous permet de démarrer une ligne avec un espace.)
Voici une autre approche.
@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
exemple de sortie:
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. :)
Oui, très possible. ^ est le caractère de fuite littéral, mettez-le juste avant votre nouvelle ligne. Dans cet exemple, j'ai aussi mis la ligne supplémentaire pour qu'elle soit correctement imprimée dans le fichier:
@echo off
echo foo ^
this is ^
a multiline ^
echo > out.txt
sortie:
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>
à DosTips, siberia-man a posté une démonstration de comportement étonnant d'une fausse déclaration GOTO sous la forme de (goto) 2>nul
. Aacini et jeb ont ensuite documenté d'autres découvertes intéressantes sur le comportement étrange. Il se comporte essentiellement comme un EXIT /B
, sauf qu'il permet des commandes concaténées dans une routine appelée à exécuter dans le contexte de l'appelant parent.
voici un bref script qui démontre la plupart des points saillants:
@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!!!!
Cette étonnante comportement m'a permis d'écrire un élégant lot émulation d'ici doc avec de nombreuses options disponibles pour unix. J'ai mis en place PrintHere.bat en tant qu'utilitaire autonome qui devrait être placé dans un dossier listé dans votre chemin. Alors n'importe quel script de fournée peut facilement appeler l'utilitaire pour obtenir ici la fonctionnalité de doc.
voici le syntaxe générale d'usage:
call PrintHere :Label
Here doc text goes here
:Label
comment y parvenir?... Mon utilitaire PrintHere utilise le tour (GOTO) 2>nul
deux fois.
-
la première fois que j'utilise
(GOTO) 2>nul
pour retourner à l'appelant afin que je puisse obtenir le chemin complet vers le script d'appel afin que PrintHere sait de quel fichier Lire. J'appelle PrintHere pour la deuxième fois! -
la deuxième fois que j'utilise
(GOTO) 2>nul
pour retourner à l'appelant et passer à l'étiquette terminante de sorte que le texte de doc ici n'est pas exécuté.
Note - le script ci-dessous contient un caractère tab (0x09) dans la définition de tab, directement sous l'étiquette :start
. Certains navigateurs peuvent avoir de la difficulté à afficher et à copier l'onglet. Comme alternative, vous pouvez télécharger PrintHere.chauve.txt de mon dropbox , et il suffit de le renommer en PrintHere.chauve.
j'ai posté PrintHere.bat à DosTips , où vous pouvez suivre le développement futur.
PrintHere.chauve-souris
@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
la documentation complète est intégrée dans le script. Voici quelques exemples d'utilisation:
text output
@echo off
call PrintHere :verbatim
Hello !username!^!
It is !time! on !date!.
:verbatim
-- OUTPUT --
Hello !username!^!
It is !time! on !date!.
Développer des variables (expansion retardée n'a pas besoin d'être activé)
@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.
Développer les variables et les garnitures principaux espaces
@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.
la sortie peut être redirigée vers un fichier
@echo off
call PrintHere :label >helloWorld.bat
@echo Hello world!
:label
la sortie ne peut pas être redirigé en entrée, mais il peut être joué! Malheureusement, la syntaxe n'est pas aussi élégante parce que les deux côtés d'une pipe sont exécutés dans un nouveau CMD.Processus EXE , donc (GOTO) 2>nul
retourne à un processus cmd enfant, et non le script maître.
@echo off
call PrintHere :label "%~f0" | findstr "^" & goto :label
Text content goes here
:label
L'utilisation d'un macro avec paramètres permet d'écrire un "heredoc" d'une manière simple:
@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
autre variante:
@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
faisant référence au billet de rojo à https://stackoverflow.com/a/15032476/3627676
certainement, sa solution est ce que je cherche pour peu de temps (bien sûr, je pourrais essayer de mettre en œuvre quelque chose de similaire à cela, mais la paresse déplace le progrès :)). J'aimerais ajouter une petite amélioration au code original. J'ai pensé que ce serait mieux si la redirection vers le fichier était écrite à la fin de la ligne. Dans ce cas, la ligne heredoc starter pourrait être plus strict et son analyse plus simple.
@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
Qu'est-ce que je suggère par ce code? Nous allons considérer.
le code de Rojo est très strict:
- ne permet pas plus d'un caractère d'espace dans la chaîne de caractères entre
call
et:heredoc
-
call :heredoc
est collante au bord de la ligne (pas tout les espaces au début de la ligne) - redirection vers le fichier est autorisé quelque part dans la ligne (pas très utile) -
les Choses, je suggère:
- moins strict (plus d'un espace comme délimiteur)
- redirection vers un fichier est autorisé à la fin de la ligne (arrondi supports sont permis et nécessaire)
- non collante code du bord de la ligne
"1519490920 mise à jour" Update 1 : Amélioration de la vérification et de l'exécution de l'heredoc début:
- commande importante est seulement
call :heredoc LABEL
oucall :heredoc :LABEL
. Ainsi, après l'impression du contenu heredoc il est possible de passer à une autre étiquette, fin du script ou lancerexit /b
. - supprimé commande inutilisée et inutile goto: next2
Update 2 :
- les délimiteurs intérieurs
for
sont(
)
>
&
|
TAB
,
;
=
SPACE
- L'interrupteur
/I
ajouté àif
Update 3 :
Par le lien suivant vous pouvez trouver la version complète du script autonome (intégration dans votre des scripts sont disponibles) https://github.com/ildar-shaimordanov/tea-set/blob/master/bin/heredoc.bat
vous pouvez créer un bloc de texte cité avec une boucle FOR /F, donc vous n'avez pas besoin d'échapper à des caractères spéciaux comme <>|&
seulement %
doivent être échappés.
C'est parfois utile comme créer une sortie html.
@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
)
sortie
One<>&|
two 100%
three "quoted"
four
j'essaie d'expliquer le code.
La variable LF contient un caractère newline, la variable NL contient ^<LF><LF>^
.
Cela peut être utilisé avec l'extension de pourcentage pour placer un caractère newline et un caret à la fin de la ligne.
normalement Un FOR /f divise un texte cité en plusieurs jetons, mais une seule fois.
En insérant des caractères newline, la boucle FOR se divise en plusieurs lignes.
Les guillemets à la première et à la dernière ligne ne servent qu'à créer la syntaxe correcte pour la boucle FOR.
À l'avant de tout les lignes sont _
comme le premier caractère sera échappé du caret multi-ligne de la ligne précédente, et si la citation est le premier caractère, il perd la capacité de fuite.
Les délimitations _
sont utilisées, car les espaces ou les virgules causent des problèmes avec XP (sinon XP-Bug essaie d'accéder aux noms de fichiers de la corbeille).
le caret à la fin de la ligne est aussi contre le Bug XP.
le bogue XP entre en vigueur lorsque un texte cité contient des ,;=<space>
caractères
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
Dans un Microsoft NMake makefile , peut-on utiliser de vraies UNIX heredocs , comme le fil demande de leur propriétaire. Par exemple, il s'agit d'une règle explicite pour créer un fichier déployer.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
où << se développe dans un nom de fichier temporaire NMake crée à la volée lors de l'exécution de la règle. C'est-à-dire quand se déploie.sed n'existe pas. Beau la chose est que les variables NMake sont étendues aussi (ici les variables nom et VERSION ). Enregistrez ceci comme makefile . Ouvrez une boîte DOS dans le répertoire de makefile et utilisez:
> nmake Deploy.sed
pour créer le fichier, et:
> nmake clean
pour l'enlever. NMAKE fait partie de toutes les versions de Visual Studio C++, y compris les Express-editions.
S'étendant sur le poteau d'éphémère, que je sens être le meilleur, ce qui suit fera une pipe:
(
@echo.line1
@echo.line2 %time% %os%
@echo.
@echo.line4
) | more
Dans ephemient post il a réorienté au début, qui est un joli style, mais vous pouvez également rediriger à la fin en tant que telle:
(
@echo.line1
@echo.line2 %time% %os%
@echo.
@echo.line4
) >C:\Temp\test.txt
notez que " @echo."n'est jamais inclus dans la sortie et "@echo."par lui-même donne une ligne vide.
C'est encore plus facile, et ressemble étroitement cat << EOF > out.txt:
C:\>copier con.txt
C'est ma première ligne de texte.
C'est ma dernière ligne de texte.
^Z
1 fichier(s) copié (s).
ressemble à ceci:
c:\>tapez.txt
C'est ma première ligne de texte.
C'est ma dernière ligne de texte.
(copie con +.txt, Tapez votre entrée, suivi de Ctrl-Z et le fichier est copié)
copie CON signifie "copie à partir de la console" (accepter l'entrée de l'utilisateur)
ce que le PO voulait était quelque chose de très spécifique (créer un fichier texte avec la sortie) et la réponse acceptée le fait parfaitement, mais la solution présentée ne fonctionne pas bien en dehors de ce contexte spécifique. Par exemple, si je veux passer une entrée multi-ligne dans une commande, Je ne peux pas utiliser la syntaxe ( echo )
. Voici ce que la liquidation de travail pour moi.
avec un script perl nommé "echolines.pl" consistant en ce qui suit (pour simuler un programme "réel" ):
use strict;
use warnings;
while (<>) {
chomp;
print qq(<$_>\n);
}
et un fichier batch nommé" testme.MTD "contenant:
@echo off
set FOO=foo
set BAR=bar
set BAZ=baz
echo %FOO%^
&echo %BAR%^
&echo %BAZ%|perl echolines.pl
l'exécution il produit le résultat attendu:
C:\>testme
<foo>
<bar>
<baz>
il faut veiller à ce que tout fonctionne correctement avec des espaces libres où que ce soit. En particulier: chaque extrémité de ligne doit être un caret ( ^ ) suivi d'une nouvelle ligne, les lignes suivantes doivent commencer immédiatement avec l'ampère ( & ) et la dernière ligne doit avoir le tuyau début immédiatement après le dernier envoi. Sinon, cela entraînera des paramètres manquants ou supplémentaires d'espace avant et après les paramètres.
essayez ce code. (Code JScript en bas écrit".html" sur le disque)
@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();
voici une variante de l'excellente solution d'ephemient. Cela vous permet de Piper plusieurs lignes dans un autre programme sans réellement créer un fichier texte et le rediriger vers votre programme:
(@echo.bla
@echo.bla
) | yourprog.exe
pour un exemple rapide et fonctionnel, vous pouvez remplacer yourprog.exe
par more
:
(@echo.bla
@echo.bla
) | more
sortie:
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
**il ajoutera une ligne vide à la fin, mais vous pouvez résoudre cela facilement, juste en utilisant la méthode de copie con:
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
attention où vous tapez ^C et ^Z dans chaque cas.