У меня есть файл Windows .bat, который я хотел бы принять от пользователя, а затем использовать результаты этого ввода как часть вызова дополнительных команд.
Например, я хотел бы принять идентификатор процесса от пользователя, а затем запустить jstack для этого идентификатора, поместив результаты вызова jstack в файл. Однако, когда я пытаюсь это сделать, это не работает.
Вот мой пример содержимого файла bat:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
и вот что появляется в jstack.txt:
Введите ID: завершить пакетное задание (Y / N)?
windows
batch-file
prompt
Nakilon
источник
источник
choice
чемset /p
Enter ID:
а не какой-то идентификатор, который вы должны были предоставить клавиатура.Ответы:
Попробуй это:
Затем вы можете использовать
%id%
в качестве параметра для другого командного файла, какjstack %id%
.Например:
источник
set /p id=Enter ID:\r\n set /p pw=Enter Passwd:
и не хотите, чтобы текст пароля отображался в окне, не говоря уже о том, чтобы отображаться в буфере команд «DosKey»? Я пробовал несколько разных способов, и не смог найти способ сделать это, кроме написания маленькой C-программы, которая бы взяла ввод и присвоила его EnvVar, но это обман! :) Я хочу, чтобы он работал только с CMD Windows."Enter ID: "
. Дает небольшой промежуток между подсказкой и ответом пользователя.Delete the internet?No silly
противDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
и,ENDLOCAL
если вы хотите, чтобы переменная оставалась локальной для текущего пакета. См. Ss64.com/nt/endlocal.htmlСинтаксис таков:
set /p variable=[string]
Посетите http://commandwindows.com/batch.htm или http://www.robvanderwoude.com/userinput.php для более глубокого погружения в пользовательский ввод с различными версиями пакетных файлов ОС Windows.
После того, как вы установили свою переменную, вы можете использовать ее следующим образом.
обратите внимание на
%VariableName%
синтаксисисточник
cmd.exe
оболочке Windows 7 , и каждый - без исключения - назначает пользовательский ввод для переменной с произвольным именем. Как ваш ответ украшает то, что уже было предоставлено?=
не обязателен.cmd
что не позволяет места?SET /P variable=[promptString]
Я не уверен, так ли это для всех версий Windows, однако на машине с XP у меня должно быть следующее:
Без строки подсказки в кавычках я получаю различные результаты в зависимости от текста.
источник
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Затем, когда вы запускаете файл и пользователь вводит что-то, что вы получаетеPrompt String Yes
вместоPrompt StringYes
Пространство после
=
очень важно.источник
если я получу то, что вы хотите, это прекрасно работает. Вы также можете использовать% input% в других командах.
источник
источник
:start
?:start
это просто маркер ... Например, он может также использовать a:end
, который вызывает такие вещи, как очистка переменной, или вызовpopd
, или что-то в этом роде. Кроме того, у вас также есть возможность использоватьIF ERRORLEVEL1 GOTO END
... или даже aGOTO ERR
, и в нем:err
есть что-то вроде эха. Произошла ошибка при попытке получить номер файла. goto: end Это, вероятно, вопрос привычки ...Для SETX нет задокументированного параметра / параметра приглашения, как для SET.
Если вам нужно запросить переменную окружения, которая выживет после перезагрузки, вы можете использовать SETX для ее хранения.
Переменная, созданная SETX, не будет использоваться, пока вы не перезапустите командную строку. Тем не менее, вы можете установить SETX для переменной, которая уже была SET, даже если она имеет то же имя.
Это работает для меня в Windows 8.1 Pro:
(Кавычки вокруг существующей переменной необходимы.)
Эта процедура позволяет вам использовать временную переменную, созданную SET, во время текущего сеанса и позволит вам повторно использовать переменную, созданную SETX, после перезагрузки компьютера или перезапуска приглашения CMD.
(Отредактировано для правильного форматирования абзацев кода.)
источник
У меня есть маленький cmd, который я использую при подготовке компьютера к клиентам: он вызывает пользователя для ввода и переименовывает компьютер в него.
источник
Есть две возможности.
Вы забыли поставить
%id%
вjstack
вызове.Таким образом, весь правильный пакетный файл должен быть:
И / или 2. Вы поместили его в код (и забыли сообщить нам вопрос), но когда вы запустили пакетный файл, вы нажали клавишу Enter вместо ввода идентификатора (скажем, 1234).
То, что происходит, является результатом этих двух ошибок:
jstack
предполагается, что он вызывается с идентификатором, который вы ему предоставили.Но в вашем случае (в соответствии с кодом, который вы указали в вопросе) вы назвали его без какой-либо переменной. Вы написали:
Поэтому, когда вы работаете
jstack
без переменных, выдается следующее:Ваша вторая ошибка состоит в том, что вы нажали 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.
источник
Знаки доллара вокруг переменной не работают на моей машине Vista, но знаки процента работают. Также обратите внимание, что между строкой подсказки и вводом пользователя появится завершающий пробел в строке «set».
источник
C:\>set /p DestPath="Type path:"
и следующая строкаType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
пакетный файл, вы можете использовать его!EnvVariable!
для расширения до его значения во время циклов FOR или других вещей, которые не расширяют макросы, пока строка не будет фактически обработана синтаксическим анализатором Cmd. См.cmd /?
Информацию об этом, а такжеhelp setlocal
...Просто добавил
последовательность моего netsh пакетной работы. Теперь он показывает мне местоположение, на которое я отвечаю, как точку для этого образца. Я постоянно >> выводил файл, так что теперь я знаю, что такое «дом», «работа», «Starbucks» и т. Д. В поисках чистого воздуха я могу определить каналы с самым низким уровнем использования и есть ли 5 или только все 2,4 МГц WLAN вокруг.
источник
Просто чтобы сохранить значение по умолчанию для переменной. Нажмите Enter, чтобы использовать значение по умолчанию из последнего запуска вашего .bat:
При первом запуске просто проигнорируйте сообщение об отсутствии файла с начальным значением переменной (или создайте Var1.txt вручную).
источник
(set /p var=<var1.txt) 2>nul
будет подавлять сообщение об ошибке. Вы также можете датьset var1=default
вместо того, чтобы получить что-то из файла