Heredoc для Windows пакетной? - PullRequest
       81

Heredoc для Windows пакетной?

29 голосов
/ 19 июня 2009

Есть ли способ указать многострочные строки в пакете способом, аналогичным heredoc в оболочках Unix. Нечто похожее на:

cat <<EOF > out.txt
bla
bla
..
EOF

Идея состоит в том, чтобы создать настроенный файл из файла шаблона ..

Ответы [ 17 ]

1 голос
/ 01 ноября 2017

Расширяя эфемерный пост, который, на мой взгляд, является лучшим, следующий будет делать трубу:

(
    @echo.line1
    @echo.line2 %time% %os%
    @echo.
    @echo.line4
) | more

В посте ephemient он перенаправил в начале, что является хорошим стилем, но вы также можете перенаправить в конце так:

(
    @echo.line1
    @echo.line2 %time% %os%
    @echo.
    @echo.line4
) >C:\Temp\test.txt

Обратите внимание, что "@echo." никогда не включается в вывод и "@echo." сам по себе дает пустую строку.

1 голос
/ 16 августа 2011

В Microsoft NMake make-файл можно использовать true UNIX-heredocs , так как владелец потока запросил их. Например, это явное правило для создания файла 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

где << </em> раскрывается во временное имя файла, которое NMake создает на лету при выполнении правила. То есть, когда Deploy.sed не существует. Приятно, что переменные NMake тоже расширяются (здесь переменные NAME и VERSION ). Сохраните это как makefile . Откройте DOS-ящик в каталоге makefile и используйте:

> nmake Deploy.sed

для создания файла и:

> nmake clean

чтобы удалить его. NMake является частью всех версий Visual Studio C ++, включая Express-редакции.

0 голосов
/ 17 августа 2017

Вот вариант отличного решения ephemient. Это позволяет вам передавать несколько строк в другую программу без фактического создания текстового файла и ввода, перенаправляя его в вашу программу:

(@echo.bla
@echo.bla
) | yourprog.exe

Для быстрого рабочего примера вы можете заменить yourprog.exe на more:

(@echo.bla
@echo.bla
) | more

Выход:

bla
bla
0 голосов
/ 15 апреля 2017

Попробуйте этот код. (Код JScript внизу записывает «out.html» на диск)

@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 голосов
/ 17 ноября 2015
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

** Это добавит пустую строку в конце, но вы можете решить это легко, просто используя метод copy 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

Осторожно, где вы вводите ^ C и ^ Z в каждом случае.

0 голосов
/ 23 июля 2013

ОП хотел что-то очень специфическое (создание текстового файла с выходными данными), и принятый ответ прекрасно справляется с этой задачей, но представленное решение не работает хорошо вне этого конкретного контекста. Например, если я хочу передать многострочный ввод в команду, я не могу использовать синтаксис ( echo ). Вот что мне помогло.

С учетом сценария perl с именем "echolines.pl", состоящего из следующего (для имитации "реальной" программы):

use strict;
use warnings;

while (<>) {
        chomp;
        print qq(<$_>\n);
}

и командный файл с именем "testme.bat", содержащий:

@echo off

set FOO=foo
set BAR=bar
set BAZ=baz

echo %FOO%^
&echo %BAR%^
&echo %BAZ%|perl echolines.pl

при запуске выдает ожидаемый результат:

C:\>testme
<foo>
<bar>
<baz>

Необходимо соблюдать осторожность с пробелами, чтобы убедиться, что все работает правильно, без каких-либо пустых мест. В частности: каждый конец строки должен быть символом (^), за которым следует новая строка, последующие строки должны начинаться сразу с амперсанда (&), а в последней строке должен быть канал, начинающийся сразу после последнего отправляемого элемента. Невыполнение этого требования приведет к отсутствию параметров или лишним пробелам до и после параметров.

0 голосов
/ 20 августа 2009

Это еще проще и очень похоже на cat << EOF> out.txt:

C: \> copy con out.txt
Это моя первая строка текста.
Это моя последняя строка текста.
^ Z
1 файл (ов) скопирован.

Вывод выглядит так:

C: \> type out.txt
Это моя первая строка текста.
Это моя последняя строка текста.

(скопируйте con + out.txt, введите свой ввод, затем Ctrl-Z и файл будет скопирован)

COPY CON означает «копировать с консоли» (принять ввод пользователя)

...