Mehrzeilige Eingabe (hier Dokumente) für Befehle in cmd.exe-Skripts

2636
Krumelur

In Bash kann ich so etwas tun

somecmd << END a lot of  text here END 

Eingabe eines Befehls direkt aus einem Skript. Ich muss dasselbe in CMD.exe-Batchdateien (.cmd-Skripts) tun. Ist es möglich?

1
Nun, da ich weiß, wie sie heißen, fand ich eine vorherige Frage zu Stackoverflow: http://stackoverflow.com/questions/1015163/heredoc-for-windows-batch Zu komplex für mich. Zeit zum Wechseln zu einer anderen Shell / Sprache :) Krumelur vor 8 Jahren 0

3 Antworten auf die Frage

2
B. Reynolds

Es ist einfach, aber nicht so sauber wie in Unix / Linux. Versuche dies:

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

Beachten Sie, dass Sie .hinter der Echo-Anweisung eine Zeile mit Leerzeichen beginnen können. Das @Symbol wird benötigt, um zu verhindern, dass die Echo-Anweisung an gesendet wird somecmd. Sie können das @Symbol so entfernen:

echo off (echo.a lot of echo.text here ) | somecmd echo on 
funktionierte auf Windows 10 CMD, funktioniert jedoch nicht mit PowerShell FWIW. Wird mit DiskPart verwendet, um einen Startbefehl weiterzuleiten (ohne eine einzeilige Textdatei als Skript verwenden zu müssen). kevinf vor 6 Jahren 0
Ja, diese Anweisungen funktionieren mit cmd.exe, nicht mit powershell.exe. Wenn Sie Scrips für PowerShell schreiben möchten, ist dies nicht das Thema für Sie. B. Reynolds vor 6 Jahren 0
Hier ist ein anderes Beispiel ... B. Reynolds vor 6 Jahren 0
Angenommen, Sie haben ein Programm namens ABCDEFG.exe, das mehrzeilige Eingaben von STDIN erfordert ... auch als "Steuerkarten" bezeichnet. Dies ist ein sehr häufiges Szenario in Unix, Linux und vielen "Mainframe" -Betriebssystemen wie MPE von Hewlett Packard und z / OS von IBM. Angenommen, das Programm erfordert drei Zeilen Eingabe, und das Programm ABCDEFG.exe befindet sich in "C: \ My Directory" (beachten Sie den Speicherplatz in "Mein Verzeichnis"). So funktioniert das in cmd.exe: echo off (echo. STEUERKARTE EINE Echo. STEUERKARTE ZWEI Echo. STEUERKARTE DREI) | "C: \ Mein Verzeichnis \ ABCDEFG.exe" echo ein B. Reynolds vor 6 Jahren 0
1
Jonno

Ich glaube, Sie können ^für jede Zeile ein einzelnes Zeichen verwenden.

Z.B:

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

kehrt zurück:

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 
Vielen Dank! Obwohl nützlich, müsste ich die Eingabe über stdin und nicht als Befehlszeilenargumente bereitstellen. Ich könnte den Befehl 'Echo' pfeifen, aber dann verliere ich die Zeilenbrüche. Ich glaube auch, dass die Länge der Befehlszeile begrenzt ist. Krumelur vor 8 Jahren 0
@Krumelur Ah, ich verstehe jetzt, Entschuldigung, ich habe die Frage falsch interpretiert. Ich bin nicht sicher, ob Sie den vorherigen Kommentar gesehen haben, der mit [diese Frage] verlinkt wurde (http://stackoverflow.com/questions/6979747/read-stdin-stream-in-a-batch-file) und wie relevant er wäre zu deiner Situation? Jonno vor 8 Jahren 0
Ja, ich habe es gesehen und ist für mich nicht relevant. Diese Frage zu SO ist jedoch genau das, was ich für http://stackoverflow.com/questions/1015163/heredoc-for-windows-batch fordere. Leider scheint es unmöglich, dies auf einfache Weise zu tun. Krumelur vor 8 Jahren 0
Ich bezeichne Ihre Frage als Antwort, da sie anscheinend die engste ist, die Sie in cmd.exe erhalten können, ohne ernsthafte Hackerangriffe oder externe Abhängigkeiten. Krumelur vor 8 Jahren 0
0
schlebe

Bis jetzt habe ich keine Lösung für dieses Problem gefunden!

Bei der Definition einiger BAT-Skripts gibt es nur eine Problemumgehung .

Mit meinem Skript sieht die Lösung für Ihr Problem so aus

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

In allen Fällen ist die direkte Indirektion jedoch nicht möglich.

INIT-TRAMEX.batDatei definiert %ASSIGN-SYSOUT%und %W%Variablen

::****************************************************************************** ::* 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-SYSOUTSkript definiert %sysout%Variable und erstellt eine leere Datei. Es enthält folgende Zeilen

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

WRITE-TEXT Skript enthält folgende Zeilen

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

Mit diesen Tipps ist das DOS-Skript besser lesbar.