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)?
windows
batch-file
prompt
Nakilon
quelle
quelle
choice
alsset /p
Enter ID:
eine ID gesetzt wurde, von der Sie eigentlich eine ID liefern sollten die Tastatur.Antworten:
Versuche dies:
Sie können dann
%id%
als Parameter für eine andere Batch-Datei wie verwendenjstack %id%
.Zum Beispiel:
quelle
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."Enter ID: "
. Gibt einen kleinen Abstand zwischen der Eingabeaufforderung und der Benutzerantwort.Delete the internet?No silly
vsDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
und,ENDLOCAL
wenn Sie möchten, dass die Variable lokal für den aktuellen Stapel bleibt. Siehe ss64.com/nt/endlocal.htmlDie 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.
Beachten Sie die
%VariableName%
Syntaxquelle
cmd.exe
Shell getestet und jeder - ohne Ausnahme - Benutzereingaben einer willkürlich benannten Variablen zugewiesen. Wie verschönert Ihre Antwort das, was bereits bereitgestellt wurde?=
ist nicht notwendig.cmd
passiert , das keinen Platz lässt?SET /P variable=[promptString]
Ich bin nicht sicher, ob dies für alle Windows-Versionen der Fall ist. Auf meinem XP-Computer muss ich jedoch Folgendes verwenden:
Ohne die Eingabeaufforderungszeichenfolge in Anführungszeichen erhalte ich je nach Text unterschiedliche Ergebnisse.
quelle
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Wenn Sie dann die Datei ausführen und der Benutzer etwasPrompt String Yes
Prompt StringYes
Der Raum danach
=
ist sehr wichtig.quelle
Wenn ich bekomme, was Sie wollen, funktioniert das gut. Sie können% input% auch in anderen Befehlen verwenden.
quelle
quelle
:start
?:start
ist nur ein Marker ... Zum Beispiel könnte er auch ein verwenden,:end
was dazu führt, dass Dinge wie die Bereinigung von Variablen passieren oder einpopd
oder so etwas aufrufen . Dann haben Sie auch die Möglichkeit, einIF ERRORLEVEL1 GOTO END
... oder sogar ein zu verwendenGOTO ERR
und unter:err
so etwas wie echo Ein Fehler ist aufgetreten, als Sie versucht haben, die Dateinummer abzurufen. goto: end Es ist wahrscheinlich eine Gewohnheit ...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:
(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.)
quelle
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.
quelle
Es gibt zwei Möglichkeiten.
Sie haben vergessen,
%id%
denjstack
Anruf zu tätigen.Die gesamte richtige Batch-Datei sollte also sein:
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:
Wenn Sie also
jstack
ohne Variable ausgeführt werden, wird Folgendes ausgegeben: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 desset
Befehls 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.txt
Code 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.
quelle
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.
quelle
C:\>set /p DestPath="Type path:"
und die nächste Zeile istType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
in 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. Siehecmd /?
für Informationen dazu sowiehelp setlocal
...Gerade hinzugefügt die
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.
quelle
Nur um einen Standardwert der Variablen beizubehalten. Drücken Sie die Eingabetaste, um die Standardeinstellung aus der letzten Ausführung Ihrer .bat zu verwenden:
Ignorieren Sie im ersten Durchlauf einfach die Meldung über fehlende Datei mit dem Anfangswert der Variablen (oder erstellen Sie Var1.txt manuell).
quelle
(set /p var=<var1.txt) 2>nul
wird die Fehlermeldung unterdrücken. Sie können auch geben,set var1=default
anstatt etwas aus einer Datei zu bekommen