В Windows cmd как запросить ввод данных пользователем и использовать результат в другой команде? - PullRequest
331 голосов
/ 03 августа 2009

У меня есть файл Windows .bat, который я хотел бы принять от пользователя, а затем использовать результаты этого ввода как часть вызова дополнительных команд.

Например, я хотел бы принять идентификатор процесса от пользователя, а затем запустить jstack для этого идентификатора, поместив результаты вызова jstack в файл. Однако, когда я пытаюсь это сделать, это не работает.

Вот мой пример содержимого файла bat:

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

и вот что появляется в jstack.txt:

Enter ID: Terminate batch job (Y/N)? 

Ответы [ 12 ]

382 голосов
/ 03 августа 2009

Попробуйте это:

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

Затем вы можете использовать %id% в качестве параметра для другого пакетного файла, например jstack %id%.

Например:

set /P id=Enter id: 
jstack %id% > jstack.txt
93 голосов
/ 28 июля 2012

Синтаксис такой: set /p variable=[string]

Проверьте http://commandwindows.com/batch.htm или http://www.robvanderwoude.com/userinput.php для более глубокого погружения в пользовательский ввод с различными версиями пакетных файлов ОС Windows.

После того, как вы установили свою переменную, вы можете использовать ее следующим образом.

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

обратите внимание на синтаксис %VariableName%

30 голосов
/ 03 октября 2011

Я не уверен, так ли это для всех версий Windows, однако на машине с XP, которую я имею, мне нужно использовать следующее:

set /p Var1="Prompt String"

Без строки приглашения в кавычках я получаю различные результаты в зависимости от текста.

13 голосов
/ 05 июня 2014
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

если я получу то, что вы хотите, это прекрасно работает. Вы также можете использовать% input% в других командах.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
12 голосов
/ 19 мая 2017
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

Пробел после = очень важен.

7 голосов
/ 14 октября 2015

Для SETX нет задокументированного параметра / параметра приглашения, как для SET.

Если вам нужно запросить переменную окружения, которая выживет после перезагрузки, вы можете использовать SETX для ее хранения.

Переменная, созданная с помощью SETX, не будет использоваться, пока вы не перезапустите командную строку. Тем не менее, вы можете установить SETX для переменной, которая уже была SET, даже если она имеет то же имя.

Это работает для меня в Windows 8.1 Pro:

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

(Кавычки вокруг существующей переменной необходимы.)

Эта процедура позволяет вам использовать временную переменную, созданную SET, во время текущего сеанса и позволит вам повторно использовать переменную, созданную SETX, после перезагрузки компьютера или перезапуска приглашения CMD.

(отредактировано для правильного форматирования абзацев кода).

7 голосов
/ 29 января 2014
@echo off
:start
set /p var1="Enter first number: "
pause
4 голосов
/ 09 февраля 2018

У меня есть маленький cmd, который я использую при подготовке компьютера к клиенту: он вызывает пользователя для ввода и переименовывает компьютер в него.

@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
3 голосов
/ 14 марта 2018

Есть две возможности.

  1. Вы забыли поставить %id% в вызове jstack.

    jstack %id% > jstack.txt
    

Таким образом, весь правильный пакетный файл должен быть:

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

И / или 2. Вы поместили его в код (и забыли сообщить нам вопрос), но когда вы запустили пакетный файл, вы нажали клавишу Enter вместо ввода идентификатора (скажем, 1234).

То, что происходит, является результатом этих двух ошибок: jstack должен вызываться с идентификатором, который вы ему предоставляете.

Но в вашем случае (согласно коду, который вы указали в вопросе) вы назвали его без какой-либо переменной. Вы написали:

jstack > jstack.txt

Поэтому, когда вы запускаете jstack без переменной, выдается следующее:

Terminate batch file Y/N? 

Ваша вторая ошибка заключается в том, что вы нажимаете Enter вместо указания значения, когда программа спросит вас: Enter ID:. Если бы вы в этот момент ввели идентификатор, скажем, 1234, переменная %id% стала бы этим значением, в нашем случае 1234. Но вы НЕ указали значение и вместо этого нажали Enter. Если для переменной не задано какое-либо значение, и если для этой переменной ранее не было установлено ничего, то для переменной %id% задается приглашение команды set !! Так что теперь %id% установлено на Enter ID:, которое отображалось на вашем экране в соответствии с запросом в командном файле ДО того, как вы вызвали jstack.

Но я подозреваю, что у вас в коде командного файла jstack %id% > jstack.txt есть код %id (и он опущен по ошибке из вопроса), и что вы нажали ввод без ввода идентификатора. Затем пакетная программа повторила идентификатор, который теперь называется «Введите идентификатор:», и затем запустила jstack Enter ID: > jstack.txt

Jstack сам повторил ввод, обнаружил ошибку и попросил прекратить.
И все это было записано в файл jstack.txt.

2 голосов
/ 31 июля 2012

Знаки доллара вокруг переменной не работают на моей машине Vista, но знаки процента работают. Также обратите внимание, что между приглашением и вводом пользователя появится завершающий пробел в строке «set».

...