У меня есть файл Windows .bat, который я хотел бы принять пользовательским вводом, а затем использовать результаты этого ввода как часть вызова дополнительных команд.
Например, я хотел бы принять идентификатор процесса от пользователя, а затем запустить jstack против этого идентификатора, поместив результаты jstack call в файл. Однако, когда я пытаюсь это, это не работает.
Вот мой образец содержимого файла летучей мыши:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
и вот что появляется на jstack.txt:
& Лт; pre > Введите ID: Завершить пакетное задание (Да / Нет)? & Лт; / pre >
Попробуйте это:
@echo off
set /p id="Enter ID: "
Затем вы можете использовать % id%
в качестве параметра для другого пакетного файла, такого как jstack% id%
.
Например:
set /P id=Enter id:
jstack %id% > jstack.txt
Синтаксис таков: 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%
Я не уверен, что это относится ко всем версиям Windows, однако на компьютере XP мне нужно использовать следующее:
set /p Var1="Prompt String"
Без строки приглашения в кавычках я получаю различные результаты в зависимости от текста.
set /p choice= "Please Select one of the above options :"
echo '%choice%'
Пространство после =
очень важно.
@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
Для SETX нет документированного / ускоренного параметра, как для SET
Если вам нужно запросить переменную среды, которая переживет перезагрузки, вы можете использовать SETX для ее хранения.
Переменная, созданная SETX, не будет использоваться, пока вы не перезапустите командную строку. Однако вы можете SETX переменную, которая уже была SET, даже если она имеет то же имя.
Это работает для меня в Windows 8.1 Pro:
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(Цитаты вокруг существующей переменной необходимы.)
Эта процедура позволяет вам использовать временную переменную, созданную SET, во время текущего сеанса и позволит вам повторно использовать переменную, созданную SETX, при перезагрузке компьютера или перезапуске приглашения CMD.
(Редактируется для правильного форматирования абзацев кода.)
@echo off
:start
set /p var1="Enter first number: "
pause
Есть две возможности.
Вы забыли поместить % 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.
У меня есть небольшой 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
Просто добавил
set /p NetworkLocation= Enter name for network?
echo %NetworkLocation% >> netlist.txt
последовательность моей сетевой пакетной работы. Теперь он показывает мне местоположение, на которое я отвечаю, как точку для этого образца. Я постоянно > > выходной файл, чтобы я знал теперь «home», «work», «Starbucks» и т. д. В поисках чистого воздуха я могу эвулировать каналы с самым низким уровнем использования и наличие вокруг 5 или всего 2,4 МГц WLAN.
Просто чтобы сохранить значение переменной по умолчанию. Нажмите 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 вручную).