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)?
windows
batch-file
prompt
Nakilon
źródło
źródło
choice
niżset /p
Enter ID:
raczej niż jakiś identyfikator, który miałeś podać klawiatura.Odpowiedzi:
Spróbuj tego:
Następnie można użyć
%id%
jako parametru innego pliku wsadowego, takiego jakjstack %id%
.Na przykład:
źródło
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."Enter ID: "
. Daje słodką małą przestrzeń między pytaniem a odpowiedzią użytkownika.Delete the internet?No silly
vsDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
iENDLOCAL
jeśli chcesz zachować zmienną lokalną dla bieżącej partii. Zobacz ss64.com/nt/endlocal.htmlSkł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.
zwróć uwagę na
%VariableName%
składnięźródło
cmd.exe
powł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?=
nie jest konieczna.cmd
, co nie pozwala miejsca?SET /P variable=[promptString]
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:
Bez ciągu zachęty w cudzysłowie uzyskuję różne wyniki w zależności od tekstu.
źródło
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Następnie, gdy uruchomisz plik i użytkownik wpisze coś, co dostajeszPrompt String Yes
zamiastPrompt StringYes
Następne miejsce
=
jest bardzo ważne.źródło
jeśli dostanę to, co chcesz, to działa dobrze. możesz użyć% input% w innych poleceniach.
źródło
źródło
:start
?:start
jest 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ć apopd
lub coś w tym rodzaju. Następnie masz również opcję użyciaIF ERRORLEVEL1 GOTO END
... lub nawetGOTO ERR
, a poniżej:err
masz coś w rodzaju echa Wystąpił błąd podczas próby uzyskania numeru pliku. goto: koniec Prawdopodobnie jest toNie 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:
(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.)
źródło
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.
źródło
Istnieją dwie możliwości.
Zapomniałeś umieścić
%id%
wjstack
zaproszeniu.Tak więc cały poprawny plik wsadowy powinien być:
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:
jstack
należ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ś:
Więc kiedy uruchamiasz
jstack
bez zmiennej, wyświetla następujące informacje: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 wierszset
polecenia !! 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.txt
w 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.
źródło
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.
źródło
C:\>set /p DestPath="Type path:"
a następna linia toType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
plik 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. Zobaczcmd /?
informacje na ten temat, a takżehelp setlocal
...Właśnie dodałem
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.
źródło
Wystarczy zachować domyślną wartość zmiennej. Naciśnij Enter, aby użyć wartości domyślnej z ostatniego uruchomienia .bat:
W pierwszym uruchomieniu zignoruj komunikat o braku pliku z początkową wartością zmiennej (lub utwórz plik Var1.txt ręcznie).
źródło
(set /p var=<var1.txt) 2>nul
tłumi błąd. Możesz także daćset var1=default
zamiast pobierać coś z pliku