Подача многострочного ввода (здесь документы) командам в сценариях cmd.exe

2558
Krumelur

В Bash я могу сделать что-то подобное

somecmd << END a lot of  text here END 

кормить ввод команды напрямую из скрипта. Мне нужно сделать то же самое в пакетных файлах CMD.exe (сценарии .cmd). Является ли это возможным?

1
Теперь, когда я знаю, как они называются, я нашел предыдущий вопрос о Stackoverflow: http://stackoverflow.com/questions/1015163/herdoc-for-windows-batch Слишком сложный для меня. Время переключаться на другую оболочку / язык :) Krumelur 8 лет назад 0

3 ответа на вопрос

2
B. Reynolds

Это просто, но не так чисто, как в Unix / Linux. Попробуй это:

(@echo.a lot of @echo.text here ) | somecmd 

Обратите внимание, что .после оператора echo можно начинать строку с пробелов. @Символ необходим для предотвращения эха - заявления от его передачи somecmd. Вы можете устранить @символ таким образом:

echo off (echo.a lot of echo.text here ) | somecmd echo on 
работал на Windows 10 CMD, но не работает на PowerShell FWIW. Используется с DiskPart для передачи некоторой команды запуска (без создания однострочного текстового файла для использования в качестве сценария). kevinf 6 лет назад 0
Да, это заявления, которые работают с cmd.exe, а не с powershell.exe. Если вы хотите написать сценарии для PowerShell, это не тема для вас. B. Reynolds 6 лет назад 0
Вот еще один пример ... B. Reynolds 6 лет назад 0
Предположим, у вас есть программа с именем ABCDEFG.exe, которая требует многострочного ввода из STDIN ... иначе называемого «контрольные карты». Это очень распространенный сценарий в Unix, Linux и многих «мэйнфреймовых» операционных системах, таких как MPE Hewlett Packard и z / OS IBM. Предположим, что программе требуется три строки ввода, и программа ABCDEFG.exe находится в «C: \ My Directory» (обратите внимание на пробел в My Directory) ... Вот как это работает в cmd.exe: echo off (echo. КАРТА УПРАВЛЕНИЯ ОДНА ЭХО. КОНТРОЛЬНАЯ КАРТА ДВА ЭХО. КОНТРОЛЬНАЯ КАРТА ТРЕТЬЯ) | "C: \ My Directory \ ABCDEFG.exe" эхо на B. Reynolds 6 лет назад 0
1
Jonno

I believe you can use a single ^ character for each line.

EG:

echo This is a really long ^ text message that spans multiple ^ lines 

returns:

C:\Users\Jonno>echo This is a really long ^ More? text message that spans multiple ^ More? lines This is a really long text message that spans multiple lines 
Спасибо! Хотя это полезно, мне нужно будет вводить данные через stdin, а не в качестве аргументов командной строки. Я мог бы передать команду `echo`, но тогда я потерял разрывы строки. Я также считаю, что есть ограничение на длину командной строки. Krumelur 8 лет назад 0
@Krumelur Ах, теперь я понимаю, извините, я неправильно понял вопрос. Я не уверен, что вы видели предыдущий комментарий, ссылающийся на [этот вопрос] (http://stackoverflow.com/questions/6979747/read-stdin-stream-in-a-batch-file) и насколько он будет актуален в вашей ситуации? Jonno 8 лет назад 0
Да, я видел это, и это не очень важно для меня. Этот вопрос о SO, однако, именно то, что я спрашиваю для http://stackoverflow.com/questions/1015163/herdoc-for-windows-batch. Увы, это невозможно сделать простым способом. Krumelur 8 лет назад 0
Я отмечаю ваш вопрос как ответ, так как он, очевидно, ближе всего подходит к cmd.exe без каких-либо серьезных взломов или внешних зависимостей. Krumelur 8 лет назад 0
0
schlebe

До сих пор я не нашел решения этой проблемы!

У меня есть только обходной путь в определении некоторых BAT-скриптов.

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

call INIT-TRAMEX.bat  %assign-sysout% FILE.SYSOUT.TXT  %w% a lot of  %w% text here  somecmd <%sysout% 

Но во всех случаях прямое косвенное обращение невозможно.

INIT-TRAMEX.batфайл определяет %ASSIGN-SYSOUT%и %W%переменные

::****************************************************************************** ::* INIT-TRAMEX.bat ::******************************************************************************  @echo OFF  set scriptdir=c:\Scripts  set ASSIGN-SYSOUT=call %scriptdir%\AssignSysout.bat  set WRITE-TEXT=call %scriptdir%\WriteText.bat set W=call %scriptdir%\WriteText.bat 

ASSIGN-SYSOUTскрипт определяет %sysout%переменную и создает пустой файл. Он содержит следующие строки

set sysout=%1 @echo.>%sysout% del %sysout% 

WRITE-TEXT скрипт содержит следующие строки

IF "%1"=="" goto line echo %* >>%sysout% goto quit  :line  echo. >>%sysout%  :quit 

Используя эти советы, DOS-скрипт более читабелен.

Похожие вопросы