Istnieją dwa polecenia dla monitów użytkownika w wierszu poleceń systemu Windows:
- zestaw z opcją
/Pdostę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.exesystemu Windows Server 2003 można skopiować do katalogu %SystemRoot%\System32na 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.batdo 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
cmdpowodu 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.exeniedostę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.comzamiast cmd.exeinterpretatora poleceń.
set "UserChoice=!UserChoice: =!"Dodano wiersz poleceń, aby umożliwić wywołanie tego pliku wsadowego echo Y | call PromptExample.batw 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.batpowoduje 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 UserChoicez YSPACE jako wartość spowoduje uruchomienie szybkiego drugi raz z opcją Nzdefiniowany 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ą
UserChoicez Ni Y, ale wartością UserChoiceotoczoną przez "z "N"i "Y".
- W IF operatory porównania
EQUi NEQprzeznaczone 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. EQUi NEQdział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ą. EQUi NEQmoż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.comMS-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 :EOFwymaga 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=Nprzed 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.