Як у Windows cmd як запросити введення користувача та використати результат в іншій команді?


397

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

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

Ось мій зразок файлу bat-файлу:

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

і ось що з’являється в jstack.txt:

Введіть ідентифікатор: Закінчити пакетну роботу (Y / N)? 

2
"Закінчити пакетну роботу (Y / N)?" зазвичай з'являється, коли ви натискаєте ctrl-c під час роботи .bat.
Джим Бак

2
Jstack.txt буде містити вихід з jstack і нічого, що стосується вашого пакетного файлу, а також ви не сказали, що таке Jstack.
sgmoore

1
Чи не спрацювала жодна з цих відповідей? Якщо ні, ти знайшов рішення? Якщо ви це зробили, було б корисно, якби ви розмістили його тут як самовідповідь.
Маслор

1
Якщо ви хочете виправити варіанти введення, вам краще скористатися, choiceніжset /p
icc97

2
Будь ласка, позначте мою посаду як відповідь, суть якої полягає в тому, що під час запуску пакетної програми ви натискаєте Enter, а не вводите ідентифікатор у відповідь, і тому% id% було встановлено, Enter ID: а не якийсь ідентифікатор, з якого ви повинні були надати. клавіатура.
пашуте

Відповіді:


458

Спробуйте це:

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

Потім ви можете використовувати %id%як параметр інший пакетний файл, наприклад jstack %id%.

Наприклад:

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

2
Чи є спосіб передати висновок команди SET на NIL :, щоб ви могли приховати введення тексту? Як би ви хотіли зробити: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:і не хотіли, щоб текст пароля відображався у вікні, не кажучи вже про те, щоб показати у буфері команд "DosKey"? Я спробував декілька різних способів, і не зміг знайти спосіб це зробити, крім написання невеликої програми C, щоб взяти вклад і призначити його EnvVar, але це обман! :) Я хочу, щоб вона працювала з JUST Windows CMD.
LarryF


4
Зверніть увагу на додану ніткості місця в кінці "Enter ID: ". Дає невеликий простір між підказкою та відповіддю користувача. Delete the internet?No sillyпроти Delete the internet? No silly.
icc97

Немає потреби в цитатах. Те, що @Instantsoup не вистачало, було "% id%" у рядкуjstack %id% > jstack.txt
pashute

1
Використовуйте SETLOCALта, ENDLOCALякщо ви хочете, збережіть змінну локальну до поточної партії. Дивіться ss64.com/nt/endlocal.html
endo64

99

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


Будь ласка, закінчіть своє речення ... Ви збираєтесь включити інше посилання? Крім того, я протестував усе вищезазначене в cmd.exeоболонці Windows 7 , і кожен - без винятку - призначає введення користувачеві довільно названій змінній. Як ваша відповідь прикрашає те, що вже було надано?
чб

3
Коли я опублікував свою відповідь, це насправді не виглядало так, як відповіли на початкове запитання. Оригінальне запитання: "Як ви запитаєте користувальницькі дані, а потім поворот і використовуєте його в іншій команді?" Я вважаю, що моя відповідь лаконічно відповіла на питання. Плюс до того, що ви шукаєте в Google "як отримати дані користувача з пакетного файлу", це запитання є результатом №2, тому йому потрібна правильна відповідь, на що я хотів, щоб цей форум був.
jayfessenden

14
Простір після цього =не потрібен.
Joey

Для чого нам потрібен простір? Що саме відбувається в тому, cmdщо не дає місця?
ytpillai

@Joey Я згоден, на сторінціSET /P variable=[promptString]
robvanderderwoude.com

31

Я не впевнений, що це стосується всіх версій Windows, однак на машині XP я маю використовувати наступне:

set /p Var1="Prompt String"

Без рядового рядка в лапках я отримую різні результати залежно від тексту.


+1 за "різні результати залежно від тексту": у мене було те саме питання. Тепер він друкує цитати разом з текстом, але більше немає дивної поведінки.
Бендж

6
використовуйте цей синтаксис, щоб мати лапки, але уникайте їх показу :set /p "var1=Prompt String"
Стефан,

Корисно використовувати лапки і включати пробіл в кінці, оскільки це робить підказку в командному рядку приємнішою. Наявність лапок дає зрозуміти, що в пакетному файлі є пробіл. set /p Var1="Prompt String "Потім, коли ви запускаєте файл, і користувач вводить щось, що ви отримуєте Prompt String YesзамістьPrompt StringYes
icc97


14
@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 

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

2
З чого ви починаєте :start?
Бендж

1
:startЦе просто маркер ... Наприклад, він може використовувати :endтакож а, що спричиняє такі речі, як очищення змінної чи виклик a popd, або щось подібне. Тоді ви також можете скористатися IF ERRORLEVEL1 GOTO END... або навіть a GOTO ERR, і під цим :errматимете щось на кшталт echo. Помилка сталася під час спроби отримати номер файлу. goto: end Це, мабуть, звичка ...
LarryF

8

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

Якщо вам потрібно запропонувати змінну середовища, яка переживе перезавантаження, ви можете використовувати SETX для її зберігання.

Змінна, створена SETX, не буде доступною, доки ви не перезапустите командний рядок. Однак акуратно, ви можете SETX змінну, яка вже була SET, навіть якщо вона має те саме ім'я.

Це працює для мене в Windows 8.1 Pro:

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

(Лапки навколо існуючої змінної необхідні.)

Ця процедура дозволяє використовувати тимчасову змінну, створену SET під час поточного сеансу, і дозволить повторно використовувати створену SETX змінну після перезавантаження комп'ютера або перезапуску запиту CMD.

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


5

У мене є трохи 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

Привіт, цей корисний сценарій використовується на ПК Win10 після початкової установки :-)
Werdna

5

Є дві можливості.

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

Сам Jstack повторив дані, зіткнувся з помилкою і попросив припинити.
І все це було записано у файл jstack.txt.


3

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


простір? win7 x64 rus: C:\>set /p DestPath="Type path:"а наступний рядокType path:c:\dddd
Arioch '

2
$ знак призначений для змін bash або unix. Знак %% призначений для змінних Windows.
noob

Якщо у вас є SETLOCAL ENABLEDELAYEDEXPANSIONпакетний файл, ви можете використовувати його !EnvVariable!для розширення його значення під час циклів FOR або інших речей, які не розширюють макроси, поки рядок фактично не обробляється аналізатором Cmd. Дивіться cmd /?інформацію про це, а також help setlocal...
LarryF

2

Щойно додав

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

послідовність до моєї Netsh пакетної роботи. Тепер він показує мені місце, на яке я відповідаю, як точку для цього зразка. Я постійно >> вивідний файл, тому я знаю, що зараз "додому", "робота", "Starbucks" і т. Д. Шукаю чистого повітря, я можу прислухатись до каналів із найменшим рівнем використання та чи є 5 або просто всі 2,4 МГц WLAN.


2

Просто щоб зберегти значення змінної за замовчуванням. Натисніть 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 вручну).


(set /p var=<var1.txt) 2>nulпридушитьме повідомлення про помилки. Ви можете також дати set var1=defaultзамість того, щоб отримати щось із файлу
Стефан

Стефане, друга частина вашої пропозиції не зберігає значення між пробіжками !? Чи можете ви розвинути його більше?
Антоні

ні, не між пробіжками. Він просто дає значення за замовчуванням. (у запитанні не було запиту зберігати значення між прогонами).
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.