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..

25
demandé sur Amro 2009-06-19 01:01:31

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.)

27
répondu ephemient 2009-06-18 22:10:27

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.  :)
26
répondu rojo 2013-03-01 14:56:31

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:\>
17
répondu esac 2009-06-19 06:12:23
@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>
9
répondu walid2mi 2011-08-18 10:00:24

à 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
6
répondu dbenham 2017-05-23 11:54:50

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
4
répondu Aacini 2014-04-14 03:21:33

@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
3
répondu walid2mi 2011-08-18 10:45:59

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 ou call :heredoc :LABEL . Ainsi, après l'impression du contenu heredoc il est possible de passer à une autre étiquette, fin du script ou lancer exit /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

3
répondu jsxt 2017-05-23 11:54:50

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
2
répondu jeb 2011-08-19 06:44:14
@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 
2
répondu InterociterOperator 2011-08-31 10:02:32

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

<< 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.

1
répondu Andreas Spindler 2011-08-17 13:50:45

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.

1
répondu Michael Erickson 2017-11-01 16:59:21

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)

0
répondu 2009-08-20 03:41:59

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.

0
répondu Joe Casadonte 2013-07-22 20:07:03

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();
0
répondu javacommons 2017-04-15 02:24:30

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
0
répondu B. Reynolds 2017-08-17 18:02:10
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.

-4
répondu jgodoy 2015-11-17 19:04:05