Wie fordere ich in Windows cmd zur Benutzereingabe auf und verwende das Ergebnis in einem anderen Befehl?

398

Ich habe eine Windows .bat-Datei, die ich als Benutzereingabe akzeptieren und dann die Ergebnisse dieser Eingabe als Teil des Aufrufs zusätzlicher Befehle verwenden möchte.

Zum Beispiel möchte ich eine Prozess-ID vom Benutzer akzeptieren und dann jstack für diese ID ausführen und die Ergebnisse des jstack-Aufrufs in eine Datei einfügen. Wenn ich das versuche, funktioniert es jedoch nicht.

Hier ist der Inhalt meiner Beispiel-Bat-Datei:

@echo off
set /p id=Enter ID: 
echo %id%
jstack > jstack.txt

und hier ist, was in jstack.txt angezeigt wird:

ID eingeben: Stapeljob beenden (J / N)? 
Nakilon
quelle
2
"Stapeljob beenden (J / N)?" Wird normalerweise angezeigt, wenn Sie Strg-C drücken, während Ihre .bat-Datei ausgeführt wird.
Jim Buck
2
Jstack.txt enthält die Ausgabe von jstack und nichts, was sich auf Ihre Batchdatei bezieht, und Sie haben auch nicht gesagt, was Jstack ist.
sgmoore
1
Hat keine dieser Antworten funktioniert? Wenn nicht, haben Sie eine Lösung gefunden? Wenn Sie dies getan haben, wäre es hilfreich, wenn Sie es hier als Selbstantwort posten würden.
Maslor
1
Wenn Sie feste Optionen für die Eingabe wünschen, sind Sie besser dran choicealsset /p
icc97
2
Bitte markieren Sie meinen Beitrag als Antwort. Das Wesentliche ist, dass Sie beim Ausführen des Stapelverarbeitungsprogramms die Eingabetaste drücken, anstatt an der Eingabeaufforderung eine ID anzugeben, und daher die% id% auf Enter ID: eine ID gesetzt wurde, von der Sie eigentlich eine ID liefern sollten die Tastatur.
Pashute

Antworten:

459

Versuche dies:

@echo off
set /p id="Enter ID: "

Sie können dann %id%als Parameter für eine andere Batch-Datei wie verwenden jstack %id%.

Zum Beispiel:

set /P id=Enter id: 
jstack %id% > jstack.txt
Fertigsuppe
quelle
2
Gibt es eine Möglichkeit, die Ausgabe des SET-Befehls an NIL: weiterzuleiten, damit Sie die Eingabe ausblenden können? Zum Beispiel, wenn Sie ein: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:ausführen möchten und nicht möchten, dass der Kennworttext im Fenster angezeigt wird, geschweige denn im Befehlspuffer "DosKey" angezeigt wird? Ich habe verschiedene Methoden ausprobiert und konnte keine Möglichkeit finden, dies zu tun, außer ein kleines C-Programm zu schreiben, um die Eingabe zu übernehmen und sie einem EnvVar zuzuweisen, aber das ist Betrug! :) Ich möchte, dass es mit NUR Windows CMDs funktioniert.
LarryF
4
Beachten Sie die zusätzliche Schönheit des Raums am Ende von "Enter ID: ". Gibt einen kleinen Abstand zwischen der Eingabeaufforderung und der Benutzerantwort. Delete the internet?No sillyvs Delete the internet? No silly.
icc97
Keine Notwendigkeit für die Zitate. Was @Instantsoup fehlte, war die '% id%' in der Zeilejstack %id% > jstack.txt
pashute
1
Verwenden Sie SETLOCALund, ENDLOCALwenn Sie möchten, dass die Variable lokal für den aktuellen Stapel bleibt. Siehe ss64.com/nt/endlocal.html
endo64
99

Die Syntax lautet wie folgt: set /p variable=[string]

Unter http://commandwindows.com/batch.htm oder http://www.robvanderwoude.com/userinput.php finden Sie weitere Informationen zu Benutzereingaben mit den verschiedenen Versionen von Windows-Betriebssystem-Batchdateien.

Nachdem Sie Ihre Variable festgelegt haben, können Sie sie wie folgt verwenden.

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%

Beachten Sie die %VariableName%Syntax

jayfessenden
quelle
Bitte beenden Sie Ihren Satz ... werden Sie einen weiteren Link einfügen? Außerdem habe ich alle oben genannten Funktionen in einer Windows 7- cmd.exeShell getestet und jeder - ohne Ausnahme - Benutzereingaben einer willkürlich benannten Variablen zugewiesen. Wie verschönert Ihre Antwort das, was bereits bereitgestellt wurde?
chb
3
Als ich meine Antwort veröffentlichte, sah es nicht wirklich so aus, als wäre die ursprüngliche Frage beantwortet worden. Die ursprüngliche Frage lautet: "Wie können Sie nach Benutzereingaben fragen und diese dann umkehren und in einem anderen Befehl verwenden?" Ich glaube, meine Antwort hat die Frage kurz beantwortet. Wenn Sie in Google nach "Wie erhalten Sie Benutzereingaben aus einer Batch-Datei?" Suchen, ist diese Frage die Nummer 2 in den Ergebnissen, sodass sie die richtige Antwort benötigt, für die dieses Forum gedacht war.
Jayfessenden
14
Der Platz nach dem =ist nicht notwendig.
Joey
Warum brauchen wir den Raum? Was genau geht in dercmd passiert , das keinen Platz lässt?
Ytpillai
@ Joey Ich stimme zu, die robvanderderwoude.com Seite hat keinen PlatzSET /P variable=[promptString]
icc97
31

Ich bin nicht sicher, ob dies für alle Windows-Versionen der Fall ist. Auf meinem XP-Computer muss ich jedoch Folgendes verwenden:

set /p Var1="Prompt String"

Ohne die Eingabeaufforderungszeichenfolge in Anführungszeichen erhalte ich je nach Text unterschiedliche Ergebnisse.

Daniel
quelle
+1 für "verschiedene Ergebnisse je nach Text": Ich hatte das gleiche Problem. Jetzt werden die Anführungszeichen mit dem Text gedruckt, aber es gibt kein seltsameres Verhalten mehr.
Benj
6
Verwenden Sie diese Syntax, um die Anführungszeichen zu haben , aber vermeiden Sie es , sie set /p "var1=Prompt String"
Stephan
Es ist nützlich, die Anführungszeichen zu verwenden und am Ende ein Leerzeichen einzufügen, da dies die Eingabeaufforderung in der Befehlszeile schöner macht. Wenn Sie die Anführungszeichen haben, wird deutlich, dass in der Batch-Datei ein Leerzeichen vorhanden ist. set /p Var1="Prompt String "Wenn Sie dann die Datei ausführen und der Benutzer etwas Prompt String YesPrompt StringYes
eingibt
22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

Der Raum danach =ist sehr wichtig.

hannad rehman
quelle
14
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

Wenn ich bekomme, was Sie wollen, funktioniert das gut. Sie können% input% auch in anderen Befehlen verwenden.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
fedeb
quelle
8
@echo off
:start
set /p var1="Enter first number: "
pause
Anisha Gupta
quelle
2
Warum fängst du an :start?
Benj
1
:startist nur ein Marker ... Zum Beispiel könnte er auch ein verwenden, :endwas dazu führt, dass Dinge wie die Bereinigung von Variablen passieren oder ein popdoder so etwas aufrufen . Dann haben Sie auch die Möglichkeit, ein IF ERRORLEVEL1 GOTO END... oder sogar ein zu verwenden GOTO ERRund unter :errso etwas wie echo Ein Fehler ist aufgetreten, als Sie versucht haben, die Dateinummer abzurufen. goto: end Es ist wahrscheinlich eine Gewohnheit ...
LarryF
8

Es gibt keinen dokumentierten / prompt-Parameter für SETX wie für SET.

Wenn Sie nach einer Umgebungsvariablen fragen müssen, die Neustarts überlebt, können Sie sie mit SETX speichern.

Eine von SETX erstellte Variable kann erst verwendet werden, wenn Sie die Eingabeaufforderung neu starten. Ordentlich können Sie jedoch eine Variable SETXEN, die bereits SET wurde, auch wenn sie denselben Namen hat.

Dies funktioniert für mich in Windows 8.1 Pro:

set /p UserInfo= "What is your name?  "
setx UserInfo "%UserInfo%"

(Die Anführungszeichen um die vorhandene Variable sind erforderlich.)

Mit diesem Verfahren können Sie die temporäre SET-erstellte Variable während der aktuellen Sitzung verwenden und die von SETX erstellte Variable beim Neustart des Computers oder beim Neustart der CMD-Eingabeaufforderung wiederverwenden.

(Bearbeitet, um Code-Absätze richtig zu formatieren.)

Timothy J. McGowan
quelle
5

Ich habe ein kleines cmd, das ich beim Vorbereiten des PCs für Clients verwende: Es ruft den Benutzer zur Eingabe auf und benennt den PC in dieses um.

@ECHO "remember to run this as admin."
@ECHO OFF
SET /P _inputname= Please enter an computername:
@ECHO Du intastede "%_inputname%"
@ECHO "The pc will restart after this"
pause
@ECHO OFF
wmic computersystem where name="%COMPUTERNAME%" call rename name="%_inputname%"

shutdown -r -f
Werdna
quelle
Hallo nochmal, dieses nützliche Skript wird nach der Ersteinrichtung auf dem Win10-PC verwendet :-)
Werdna
5

Es gibt zwei Möglichkeiten.

  1. Sie haben vergessen, %id%den jstackAnruf zu tätigen.

    jstack %id% > jstack.txt
    

Die gesamte richtige Batch-Datei sollte also sein:

@echo off
set /p id=Enter ID: 
echo %id%
jstack %id% > jstack.txt

Und / oder 2. Sie haben es in den Code eingefügt (und vergessen, uns dies in der Frage mitzuteilen), aber als Sie die Batch-Datei ausgeführt haben, haben Sie die Eingabetaste gedrückt, anstatt eine ID einzugeben (z. B. 1234).

Was passiert, ist das Ergebnis dieser beiden Fehler: jstack soll mit der ID aufgerufen werden, die Sie angeben.

Aber in Ihrem Fall (gemäß dem Code, den Sie in der Frage angegeben haben) haben Sie es ohne Variable aufgerufen. Sie schrieben:

jstack > jstack.txt

Wenn Sie also jstackohne Variable ausgeführt werden, wird Folgendes ausgegeben:

Terminate batch file Y/N? 

Ihr zweiter Fehler ist, dass Sie die Eingabetaste gedrückt haben, anstatt einen Wert anzugeben, als Sie vom Programm gefragt wurden : Enter ID:. Wenn Sie zu diesem Zeitpunkt eine ID eingegeben hätten, z. B. 1234, würde die %id%Variable diesen Wert annehmen, in unserem Fall 1234. Sie haben jedoch KEINEN Wert angegeben und stattdessen die Eingabetaste gedrückt. Wenn Sie der Variablen keinen Wert geben und diese Variable zuvor nicht auf etwas anderes gesetzt wurde, wird die Variable %id%auf die Eingabeaufforderung des setBefehls gesetzt !! Jetzt %id%ist also festgelegt, Enter ID:welches auf Ihrem Bildschirm wie in der Batch-Datei angefordert wiedergegeben wurde, BEVOR Sie den jstack aufgerufen haben.

Aber ich vermute, Sie haben den jstack %id% > jstack.txtCode in Ihrer Batch-Datei mit dem %id(und haben ihn versehentlich in der Frage weggelassen) und Sie drücken die Eingabetaste, ohne eine ID einzugeben. Das Stapelverarbeitungsprogramm gab dann die ID zurück, die jetzt "ID eingeben:" lautet, und wurde dann ausgeführtjstack Enter ID: > jstack.txt

Jstack selbst wiederholte die Eingabe, stieß auf einen Fehler und bat um Beendigung.
Und das alles wurde in die Datei jstack.txt geschrieben.

pashute
quelle
3

Dollarzeichen um die Variable funktionieren auf meinem Vista-Computer nicht, Prozentzeichen jedoch. Beachten Sie auch, dass zwischen der Eingabeaufforderung und der Benutzereingabe ein nachfolgendes Leerzeichen in der Zeile "set" angezeigt wird.

SRE
quelle
nachlaufender Raum? win7 x64 rus: C:\>set /p DestPath="Type path:"und die nächste Zeile istType path:c:\dddd
Arioch 'The
2
$ sign steht für Bash- oder Unix-Variablen. Das %% -Zeichen steht für Windows-Variablen.
Noob
Wenn Sie eine SETLOCAL ENABLEDELAYEDEXPANSIONin Ihrer Batch-Datei haben, können Sie diese !EnvVariable!während FOR-Schleifen oder anderen Dingen, die die Makros erst erweitern, wenn die Zeile tatsächlich vom Cmd-Parser verarbeitet wird, auf ihren Wert erweitern. Siehe cmd /?für Informationen dazu sowie help setlocal...
LarryF
2

Gerade hinzugefügt die

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

Sequenz zu meinem Netsh-Batch-Job. Es zeigt mir jetzt den Ort, an dem ich antworte, als Punkt für dieses Beispiel. Ich >> ständig die Ausgabedatei, damit ich jetzt "Zuhause", "Arbeit", "Starbucks" usw. weiß. Auf der Suche nach klarer Luft kann ich die Kanäle mit der geringsten Nutzung nutzen und feststellen, ob 5 oder nur alle 2,4-MHz-WLANs vorhanden sind.

John
quelle
2

Nur um einen Standardwert der Variablen beizubehalten. Drücken Sie die Eingabetaste, um die Standardeinstellung aus der letzten Ausführung Ihrer .bat zu verwenden:

@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt

rem YourApp %Var1%

Ignorieren Sie im ersten Durchlauf einfach die Meldung über fehlende Datei mit dem Anfangswert der Variablen (oder erstellen Sie Var1.txt manuell).

Antoni
quelle
(set /p var=<var1.txt) 2>nulwird die Fehlermeldung unterdrücken. Sie können auch geben, set var1=defaultanstatt etwas aus einer Datei zu bekommen
Stephan
Stephan, im zweiten Teil Ihres Vorschlags bleiben die Werte zwischen den Läufen nicht erhalten!? Kannst du es weiterentwickeln?
Antoni
Nein, nicht zwischen den Läufen. Es gibt nur einen Standardwert. (Es gab keine Anforderung, den Wert zwischen den Läufen in der Frage zu speichern.)
Stephan