В Windows cmd, как мне запросить пользовательский ввод и использовать результат в другой команде?

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

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

Вот мой образец содержимого файла летучей мыши:

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

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

& Лт; pre > Введите ID: Завершить пакетное задание (Да / Нет)? & Лт; / pre >

Комментарии к вопросу (6)

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

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

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

Например:

set /P id=Enter id: 
jstack %id% > jstack.txt
Комментарии (5)

Синтаксис таков: 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%

Комментарии (7)

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

set /p Var1="Prompt String"

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

Комментарии (3)
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

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

Комментарии (0)
@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 
Комментарии (0)

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

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

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

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

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

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

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

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

Комментарии (0)

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

  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 (и по ошибке пропустил его из вопроса), и что вы нажмете ввод, не введя идентификатор. Затем пакетная программа повторила идентификатор, который теперь называется «Enter ID:», а затем запустила jstack Enter ID: > jstack.txt

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

Комментарии (0)

У меня есть небольшой 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
Комментарии (1)

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

Комментарии (3)

Просто добавил

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

последовательность моей сетевой пакетной работы. Теперь он показывает мне местоположение, на которое я отвечаю, как точку для этого образца. Я постоянно > > выходной файл, чтобы я знал теперь «home», «work», «Starbucks» и т. д. В поисках чистого воздуха я могу эвулировать каналы с самым низким уровнем использования и наличие вокруг 5 или всего 2,4 МГц WLAN.

Комментарии (0)

Просто чтобы сохранить значение переменной по умолчанию. Нажмите Enter, чтобы использовать значение по умолчанию при недавнем запуске .bat:

@echo off
set /p Var1= Var1.txt

rem YourApp %Var1%

В первом запуске просто проигнорируйте сообщение об отсутствии файла с начальным значением переменной (или создайте Var1.txt вручную).

Комментарии (3)