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

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

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

Вот мой пример файла bat bat:

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

и вот что отображается в jstack.txt:

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

Ответ 1

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

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

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

Например:

set /P id=Enter id: 
jstack %id% > jstack.txt

Ответ 2

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

Ответ 3

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

set /p Var1="Prompt String"

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

Ответ 4

@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 

Ответ 5

set /p choice= "Please Select one of the above options :" 
echo '%choice%'

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

Ответ 6

@echo off
:start
set /p var1="Enter first number: "
pause

Ответ 7

Для SETX не существует документально подтвержденного/приглашающего параметра, как для SET.

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

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

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

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

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

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

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

Ответ 8

У меня есть маленький 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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

к моему пакетному заданию netsh. Теперь он показывает мне место, в котором я отвечаю, как точка для этого образца. Я постоянно → выходной файл, поэтому я знаю теперь "home", "work", "Starbucks" и т.д. Ищете чистый воздух, я могу эвакуировать самые низкие каналы использования и есть ли 5 ​​или только все беспроводные локальные сети 2,4 МГц.

Ответ 12

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

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

rem YourApp %Var1%

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

Ответ 13

попробуй это

set /p input="Input"
echo %input%
txt %id% > txt.txt