W jaki sposób mam pytać o dane wejściowe użytkownika w cmd Windows i użyć wyniku w innym poleceniu?

397

Mam plik .bat systemu Windows, który chciałbym zaakceptować wprowadzony przez użytkownika, a następnie wykorzystać wyniki tego wejścia jako część wywołania dodatkowych poleceń.

Na przykład chciałbym zaakceptować identyfikator procesu od użytkownika, a następnie uruchomić jstack dla tego identyfikatora, umieszczając wyniki wywołania jstack w pliku. Jednak gdy spróbuję, to nie działa.

Oto moja przykładowa zawartość pliku nietoperza:

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

a oto co pojawia się w jstack.txt:

Wprowadź identyfikator: Zakończyć zadanie wsadowe (T / N)? 
Nakilon
źródło
2
„Zakończyć zadanie wsadowe (T / N)?” zazwyczaj pojawia się, gdy naciśniesz ctrl-c, gdy uruchomiony jest .bat.
Jim Buck
2
Jstack.txt będzie zawierał dane wyjściowe z jstack i nic związanego z plikiem wsadowym, a także nie powiedziałeś, czym jest Jstack.
sgmoore
1
Czy żadna z tych odpowiedzi nie zadziałała? Jeśli nie, znalazłeś rozwiązanie? Jeśli tak, pomocne byłoby opublikowanie go tutaj jako odpowiedzi własnej.
Maslor
1
Jeśli chcesz stałych opcji wprowadzania danych, lepiej użyć choiceniżset /p
icc97
2
Proszę oznaczyć mój post jako odpowiedź, którego istotą jest to, że podczas uruchamiania programu wsadowego nacisnąłeś Enter zamiast podawać identyfikator po znaku zachęty, a zatem% id% został ustawiony na Enter ID: raczej niż jakiś identyfikator, który miałeś podać klawiatura.
pashute

Odpowiedzi:

458

Spróbuj tego:

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

Następnie można użyć %id%jako parametru innego pliku wsadowego, takiego jak jstack %id%.

Na przykład:

set /P id=Enter id: 
jstack %id% > jstack.txt
Instantsoup
źródło
2
Czy istnieje sposób na przesłanie danych wyjściowych polecenia SET do NIL :, aby można było ukryć pisanie? Na przykład, jeśli chcesz zrobić: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:i nie chcesz, aby hasło wyświetlało się w oknie, nie mówiąc już o pokazywaniu w buforze poleceń „DosKey”? Wypróbowałem kilka różnych sposobów i nie byłem w stanie znaleźć sposobu, aby to zrobić, poza napisaniem małego programu C, aby pobrać dane wejściowe i przypisać je do EnvVar, ale to oszustwo! :) Chcę, aby działał z JUST Windows CMD.
LarryF,
4
Zwróć uwagę na dodatkową ładność miejsca na końcu "Enter ID: ". Daje słodką małą przestrzeń między pytaniem a odpowiedzią użytkownika. Delete the internet?No sillyvs Delete the internet? No silly.
icc97
Nie ma potrzeby cytowania. To, czego brakowało @Instantsoup, to „% id%” w liniijstack %id% > jstack.txt
pashute
1
Użyj SETLOCALi ENDLOCALjeśli chcesz zachować zmienną lokalną dla bieżącej partii. Zobacz ss64.com/nt/endlocal.html
endo64
99

Składnia jest następująca: set /p variable=[string]

Zajrzyj na http://commandwindows.com/batch.htm lub http://www.robvanderwoude.com/userinput.php, aby uzyskać głębsze informacje na temat danych wejściowych użytkownika z różnymi wersjami plików wsadowych systemu operacyjnego Windows.

Po ustawieniu zmiennej możesz dalej używać jej w następujący sposób.

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%

zwróć uwagę na %VariableName%składnię

jayfessenden
źródło
Dokończ zdanie ... czy zamierzasz dołączyć kolejny link? Przetestowałem również wszystkie powyższe w cmd.exepowłoce systemu Windows 7 i każdy - bez wyjątku - przypisuje dane wejściowe do zmiennej o dowolnej nazwie. Jak twoja odpowiedź upiększa to, co już zostało dostarczone?
chb
3
Kiedy opublikowałem swoją odpowiedź, nie wyglądało to tak, jakby pierwotne pytanie zostało udzielone. Pierwotne pytanie brzmi: „Jak poprosić użytkownika o dane wejściowe, a następnie zmienić go i użyć w innym poleceniu?” Wierzę, że moja odpowiedź z powodzeniem odpowiedziała na pytanie. Dodatkowo, gdy wyszukujesz w Google „jak uzyskać wkład użytkownika z pliku wsadowego”, to pytanie jest na 2 miejscu w wynikach, więc potrzebuje poprawnej odpowiedzi, dla której, jak sądzę, było to forum.
jayfessenden
14
Przestrzeń po =nie jest konieczna.
Joey
Dlaczego potrzebujemy przestrzeni? Co dokładnie dzieje się w tym cmd, co nie pozwala miejsca?
ytpillai
@Joey Zgadzam się, na stronie robvanderderwoude.com nie ma miejscaSET /P variable=[promptString]
icc97
31

Nie jestem pewien, czy tak jest w przypadku wszystkich wersji systemu Windows, jednak na komputerze z systemem XP muszę użyć następujących opcji:

set /p Var1="Prompt String"

Bez ciągu zachęty w cudzysłowie uzyskuję różne wyniki w zależności od tekstu.

Daniel
źródło
+1 za „różne wyniki w zależności od tekstu”: miałem ten sam problem. Teraz drukuje cytaty z tekstem, ale nie ma już dziwnego zachowania.
Benj
6
użyj tej składni, aby mieć cytaty, ale unikaj ich wyświetlania :set /p "var1=Prompt String"
Stephan
Przydaje się stosowanie cudzysłowów i umieszczanie spacji na końcu, ponieważ upraszcza to wiersz poleceń. Posiadanie cytatów sprawia, że ​​w pliku wsadowym jest miejsce. set /p Var1="Prompt String "Następnie, gdy uruchomisz plik i użytkownik wpisze coś, co dostajesz Prompt String YeszamiastPrompt StringYes
icc97
22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

Następne miejsce =jest bardzo ważne.

hannad rehman
źródło
14
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

jeśli dostanę to, co chcesz, to działa dobrze. możesz użyć% input% w innych poleceniach.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
fedeb
źródło
8
@echo off
:start
set /p var1="Enter first number: "
pause
Anisha Gupta
źródło
2
Dlaczego zaczynasz :start?
Benj
1
:startjest po prostu znacznikiem ... Na przykład może również użyć znaku :end, który powoduje, że takie rzeczy jak czyszczenie zmiennych mogą się zdarzyć, wywołać a popdlub coś w tym rodzaju. Następnie masz również opcję użycia IF ERRORLEVEL1 GOTO END... lub nawet GOTO ERR, a poniżej :errmasz coś w rodzaju echa Wystąpił błąd podczas próby uzyskania numeru pliku. goto: koniec Prawdopodobnie jest to
kwestia
8

Nie ma udokumentowanego / podpowiedzi parametru dla SETX, podobnie jak dla SET.

Jeśli musisz zapytać o zmienną środowiskową, która przetrwa ponowne uruchomienie, możesz użyć SETX do jej przechowywania.

Zmienna utworzona przez SETX nie będzie użyteczna do momentu ponownego uruchomienia wiersza polecenia. Zgrabnie jednak można SETX ustawić zmienną, która została już ustawiona, nawet jeśli ma taką samą nazwę.

Działa to dla mnie w Windows 8.1 Pro:

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

(Znaki cudzysłowu wokół istniejącej zmiennej są konieczne.)

Ta procedura umożliwia użycie tymczasowej zmiennej utworzonej przez SET podczas bieżącej sesji i pozwoli na ponowne użycie zmiennej utworzonej przez SETX po ponownym uruchomieniu komputera lub ponownym uruchomieniu monitu CMD.

(Edytowane, aby poprawnie sformatować akapity kodu.)

Timothy J. McGowan
źródło
5

Mam małe polecenie cmd, którego używam podczas przygotowywania komputera do klientów: woła użytkownika do wprowadzenia danych i zmienia nazwę komputera na to.

@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
Werdna
źródło
Witaj ponownie, ten przydatny skrypt jest używany na komputerze Win10 po wstępnej konfiguracji :-)
Werdna
5

Istnieją dwie możliwości.

  1. Zapomniałeś umieścić %id%w jstackzaproszeniu.

    jstack %id% > jstack.txt
    

Tak więc cały poprawny plik wsadowy powinien być:

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

I / lub 2. Umieściłeś go w kodzie (i zapomniałeś powiedzieć nam w pytaniu), ale kiedy uruchomiłeś plik wsadowy, nacisnąłeś klawisz Enter zamiast wpisywać identyfikator (powiedzmy 1234).

To, co się dzieje, jest wynikiem tych dwóch błędów: jstacknależy go wywołać z podanym identyfikatorem.

Ale w twoim przypadku (zgodnie z kodem podanym w pytaniu) wywołałeś go bez żadnej zmiennej. Napisałeś:

jstack > jstack.txt

Więc kiedy uruchamiasz jstackbez zmiennej, wyświetla następujące informacje:

Terminate batch file Y/N? 

Twój Drugim błędem jest to, że został naciśnięty przycisk Enter zamiast dawać wartość, gdy program zapytałem: Enter ID:. Gdybyś w tym miejscu wprowadziłby identyfikator, powiedzmy 1234, %id%zmienna stałaby się tą wartością, w naszym przypadku 1234. Ale NIE podałeś wartości, a zamiast tego nacisnąłeś Enter. Jeśli nie podasz zmiennej żadnej wartości, a jeśli ta zmienna nie była wcześniej ustawiona na nic innego, wówczas zmienna %id%zostanie ustawiona na wiersz setpolecenia !! Więc teraz %id%jest ustawione, Enter ID:które zostało powtórzone na ekranie zgodnie z żądaniem w pliku wsadowym PRZED wywołaniem jstack.

Ale podejrzewam, że MASZ jstack %id% > jstack.txtw swoim pliku wsadowym kod z %id(i pomyłkowo go pominąłeś w pytaniu) i że wcisnąłeś enter bez wpisywania identyfikatora. Program wsadowy następnie powtórzył identyfikator, który jest teraz „Wprowadź identyfikator:”, a następnie uruchomił sięjstack Enter ID: > jstack.txt

Sam Jstack powtórzył dane wejściowe, napotkał błąd i poprosił o zakończenie.
Wszystko to zostało zapisane w pliku jstack.txt.

pashute
źródło
3

Znaki dolara wokół zmiennej nie działają na moim komputerze z systemem Vista, ale znaki procentu działają. Zauważ też, że końcowe spacje w linii „set” pojawią się między pytaniem a danymi wejściowymi użytkownika.

SRE
źródło
końcowe miejsce? win7 x64 rus: C:\>set /p DestPath="Type path:"a następna linia toType path:c:\dddd
Arioch 'The
2
Znak $ dotyczy zmiennych bash lub unix. Znak %% dotyczy zmiennych systemu Windows.
noob
Jeśli masz SETLOCAL ENABLEDELAYEDEXPANSIONplik wsadowy, możesz go użyć !EnvVariable!do rozwinięcia go do wartości podczas pętli FOR lub innych rzeczy, które nie rozwijają makra, dopóki wiersz nie zostanie przetworzony przez parser Cmd. Zobacz cmd /?informacje na ten temat, a także help setlocal...
LarryF 30.04.2016
2

Właśnie dodałem

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

sekwencja do mojego zadania wsadowego netsh. Teraz pokazuje mi lokalizację, na którą odpowiadam, jako punkt dla tej próbki. Ciągle >> plik wyjściowy, więc wiem teraz „dom”, „praca”, „Starbucks” itp. Poszukując czystego powietrza, mogę mówić o kanałach o najniższym zużyciu i o tym, czy w pobliżu jest 5, czy tylko 2,4 MHz sieci WLAN.

Jan
źródło
2

Wystarczy zachować domyślną wartość zmiennej. Naciśnij Enter, aby użyć wartości domyślnej z ostatniego uruchomienia .bat:

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

rem YourApp %Var1%

W pierwszym uruchomieniu zignoruj ​​komunikat o braku pliku z początkową wartością zmiennej (lub utwórz plik Var1.txt ręcznie).

Antoni
źródło
(set /p var=<var1.txt) 2>nultłumi błąd. Możesz także dać set var1=defaultzamiast pobierać coś z pliku
Stephan
Stephan, Druga część twojej propozycji nie zachowuje wartości między przebiegami !? Czy możesz to bardziej rozwinąć?
Antoni
nie, nie między biegami. Po prostu daje wartość domyślną. (w pytaniu nie było żądania zapisania wartości między przebiegami).
Stephan