Istnieją dwa polecenia dla monitów użytkownika w wierszu poleceń systemu Windows:
- zestaw z opcją
/P
dostępną we wszystkich wersjach systemu Windows NT z włączonymi rozszerzeniami poleceń i
- choice.exe jest dostępny domyślnie w systemie Windows Vista i nowszych wersjach systemu Windows dla użytkowników komputerów PC oraz w systemie Windows Server 2003 i nowszych serwerowych wersjach systemu Windows.
set to wewnętrzne polecenie procesora poleceń systemu Windows cmd.exe
. Opcja/P
monitowania użytkownika o ciąg jest dostępna tylko przy włączonych rozszerzeniach poleceń, które są domyślnie włączone, ponieważ w przeciwnym razie prawie żaden plik wsadowy nie działałby już w dzisiejszych czasach.
choice.exe to osobna aplikacja konsolowa (polecenie zewnętrzne) znajdująca się w %SystemRoot%\System32
. choice.exe
systemu Windows Server 2003 można skopiować do katalogu %SystemRoot%\System32
na komputerze z systemem Windows XP w celu użycia w systemie Windows XP, podobnie jak wiele innych poleceń, które nie są domyślnie dostępne w systemie Windows XP, ale są domyślnie dostępne w systemie Windows Server 2003.
Jest najlepszą praktyką do używania rzecz WYBORU nad wykorzystaniem SET / P z powodu następujących powodów:
- WYBÓR akceptuje tylko klucze (odpowiednio znaki odczytane ze STDIN ) określone po opcji
/C
(iCtrl+C ) i generuje dźwięk błędu, jeśli użytkownik naciśnie niewłaściwy klawisz.
- WYBÓR nie wymaga wciskania innego klawisza niż jeden z dopuszczalnych. CHOICE wychodzi natychmiast po naciśnięciu akceptowalnego klawisza, podczas gdy SET / P wymaga, aby użytkownik zakończył wprowadzanie za pomocą RETURNlub ENTER.
- Z WYBOREM jest to możliwe można zdefiniować opcję domyślną i limit czasu, aby automatycznie przejść do opcji domyślnej po kilku sekundach bez czekania na użytkownika.
- Wyjście jest lepsze po automatycznej odpowiedzi na monit z innego pliku wsadowego, który wywołuje plik wsadowy z podpowiedzią, używając czegoś podobnego
echo Y | call PromptExample.bat
do użycia WYBORU .
- Ocena wyboru użytkownika jest znacznie łatwiejsza dzięki WYBORZE, ponieważ WYBÓR wychodzi z wartością zgodną z wciśniętym klawiszem (znakiem), który jest przypisany do ERRORLEVEL, który można łatwo ocenić jako następny.
- Zmienna środowiskowa używana w SET / P nie jest zdefiniowana, jeśli użytkownik naciska tylko klawisz RETURNlub ENTERi nie została zdefiniowana przed monitem użytkownika. Użyta zmienna środowiskowa w wierszu poleceń SET / P zachowuje swoją bieżącą wartość, jeśli została zdefiniowana wcześniej, a użytkownik naciśnie tylko RETURNlub ENTER.
- Użytkownik ma swobodę wprowadzania czegokolwiek po wyświetleniu monitu za pomocą polecenia SET / P, w tym ciągu znaków, który później powoduje zakończenie wykonywania pliku wsadowego z
cmd
powodu błędu składniowego lub w przypadku wykonywania poleceń niezawartych w pliku wsadowym przy nie dobrze zakodowany plik wsadowy. Wymaga pewnych wysiłków, aby zabezpieczyć SET / P przed pomyłką lub celowym błędem wprowadzonym przez użytkownika.
Oto prosty przykład użycia preferowanego WYBORU i alternatywnie SET / P na choice.exe
niedostępnym na używanym komputerze z systemem Windows.
@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue
:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]? "
if errorlevel 2 goto :EOF
:Continue
echo So your are sure. Okay, let's go ...
Uwaga: Ten plik wsadowy używa rozszerzeń poleceń, które nie są dostępne w systemie Windows 95/98 / ME, używając command.com
zamiast cmd.exe
interpretatora poleceń.
set "UserChoice=!UserChoice: =!"
Dodano wiersz poleceń, aby umożliwić wywołanie tego pliku wsadowego echo Y | call PromptExample.bat
w systemie Windows NT4 / 2000 / XP i nie wymaga użycia echo Y| call PromptExample.bat
. Usuwa wszystkie spacje z ciągu odczytywanego ze STDIN przed uruchomieniem dwóch porównań ciągów.
echo Y | call PromptExample.bat
powoduje przypisanie YSPACE do zmiennej środowiskowej UserChoice
. Spowodowałoby to dwukrotne przetworzenie zachęty, ponieważ "Y "
nie uwzględnia wielkości liter równych "N"
ani "Y"
bez usuwania najpierw wszystkich spacji. Więc UserChoice
z YSPACE jako wartość spowoduje uruchomienie szybkiego drugi raz z opcją N
zdefiniowany jako domyślny w pliku wsadowym na drugiej szybkiej realizacji których Kolejne wyniki w niespodziewanym wyjeździe z przetwarzaniem pliku wsadowego. Tak, bezpieczne korzystanie z SET / P jest naprawdę trudne, prawda?
Aby uzyskać jeszcze więcej informacji na temat używania SET / P i CHOICE do monitowania użytkownika o wybór z listy opcji, zobacz odpowiedź na temat Jak zatrzymać interpreter poleceń systemu Windows przed zakończeniem wykonywania pliku wsadowego przy nieprawidłowym wprowadzeniu użytkownika?
Kilka dodatkowych wskazówek:
- JEŻELI porównuje dwa ciągi po lewej i po prawej stronie operatora porównania z uwzględnieniem podwójnych cudzysłowów. Zatem porównywanie bez rozróżniania wielkości liter nie jest wartością
UserChoice
z N
i Y
, ale wartością UserChoice
otoczoną przez "
z "N"
i "Y"
.
- W IF operatory porównania
EQU
i NEQ
przeznaczone są podstawowym do porównywania dwóch liczb całkowitych w zakresie -2147483648 do 2147483647, a nie do porównywania dwóch ciągów. EQU
i NEQ
działa również dla porównań ciągów, ale skutkuje porównywaniem ciągów w podwójnych cudzysłowach przy bezużytecznej próbie konwersji lewego ciągu na liczbę całkowitą. EQU
i NEQ
może być używany tylko z włączonymi rozszerzeniami poleceń. Operatory porównania dla porównań ciągów są ==
i not ... ==
działają nawet z wyłączonymi rozszerzeniami poleceń, ponieważ nawet command.com
MS-DOS i Windows 95/98 / ME już je obsługiwały. Aby uzyskać więcej informacji na temat operatorów porównania JEŻELI , zobacz Symbol równoważny NEQ, LSS, GTR itp. W plikach wsadowych systemu Windows .
- Polecenie
goto :EOF
wymaga włączonych rozszerzeń poleceń, aby naprawdę zakończyć przetwarzanie plików wsadowych. Aby uzyskać więcej informacji, zobacz Gdzie powraca GOTO: EOF?
Aby zrozumieć używane polecenia i sposób ich działania, otwórz okno wiersza polecenia, wykonaj w nim następujące polecenia i przeczytaj dokładnie wszystkie strony pomocy wyświetlane dla każdego polecenia.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Zobacz też:
SET AREYOUSURE=N
przed monitem, aby wyczyścić wybór, jeśli wcześniej uruchomiłeś skrypt w tym oknie poleceń. Bez tego domyślna pozostanie poprzednio wybrana opcja.