Windows 배치 파일에서 어떻게 "확실합니까?"프롬프트를 만들 수 있습니까?


94

한 곳에서 다른 곳으로 여러 파일을 자동으로 복사하는 배치 파일이 있습니다. 유일한 것은 명령 버퍼에서 해당 명령을 실수로 계속 선택하고 커밋되지 않은 변경 사항을 대량 덮어 쓰는 데 도움이되는 것뿐입니다.

.bat 파일이 "확실합니까"라고 표시하고 나머지 파일을 실행하기 전에 "y"를 입력하도록하려면 어떤 코드가 필요합니까? "y"만 입력하면 해당 행에서 실행을 종료해야합니다.

11 월 27 일 수정 확인 아직 알아낼 ​​수 없기 때문에 답변이없는 것으로 표시했습니다. 내가 "exit"라고 부를 때; 내가 원하는 것이 아닌 cmd.exe를 닫습니다. 이 모든 것은 Windows가 명령 버퍼를 잘못 구현했기 때문입니다. [적어도 익숙한 것과는 다릅니다]

답변:


168

다음과 같은 것을 원합니다.

@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END

echo ... rest of file ...


:END
endlocal

5
내가 추가 할 유일한 것은 SET AREYOUSURE=N명령 창에서 이전에 스크립트를 이미 실행 한 경우 선택을 취소하기 위해 프롬프트 앞에 추가하는 것 입니다. 이것이 없으면 기본값은 이전에 선택한 선택으로 유지됩니다.
isapir 2014-12-26

4
@Igal 나는 setlocal및 the endlocal가 그것을 처리해야한다고 확신 합니다. %AREYOUSURE%이후에는 더 이상 존재하지 않습니다 endlocal.

1
@dudeprgm 당신이 아마 맞습니다. 내 코드에서 놓친 것 같습니다.
isapir

2
... 중요한 두 줄 에 대한 설명 단어가 더 유용 할 것 입니다.
Wolf

@Joe 아마도 (나처럼) 그는 (아직) 이해하지 못하기 때문에 할 수 없습니다 . 따라서 그렇게한다면 답을 확장하거나 그것을 설명하는 리소스에 대한 링크를 확장 할 수 있다면 놀라 울 것입니다. :)
Marcus Mangelsdorf


15

choice명령은 모든 곳에서 사용할 수 없습니다. 최신 Windows 버전에서는 set명령에 /p사용자 입력을 얻을 수 있는 옵션이 있습니다.

SET /P variable=[promptString]

자세한 내용 set /?은 참조


... 허용되는 것보다 훨씬 더 통찰력이 있지만 우리는 분명히 긴급한 시대에 살고 있습니다.
Wolf

10

Windows 명령 줄에서 사용자 프롬프트에 사용할 수있는 두 가지 명령이 있습니다.

  • 설정 옵션을 /P사용할 수 명령 확장으로 모든 Windows NT 버전에서 사용 가능 하고
  • choice.exe 는 기본적으로 Windows Vista 이상 PC 사용자 용 Windows 버전과 Windows Server 2003 이상 Windows 서버 버전에서 사용할 수 있습니다.

set 는 Windows 명령 프로세서의 내부 명령입니다 cmd.exe. /P사용자에게 문자열을 묻는 옵션 은 기본적으로 활성화되어있는 활성화 된 명령 확장에서만 사용할 수 있습니다. 그렇지 않으면 요즘에는 거의 배치 파일이 작동하지 않습니다.

choice.exe 는에있는 별도의 콘솔 응용 프로그램 (외부 명령)입니다 %SystemRoot%\System32. Windows XP에서는 기본적으로 사용할 수 없지만 Windows Server 2003에서는 기본적으로 사용할 수있는 다른 많은 명령처럼 Windows XP에서 choice.exe사용할 수 있도록 Windows Server 2003의 디렉터리 %SystemRoot%\System32를 Windows XP 시스템의 디렉터리 에 복사 할 수 있습니다 .

그것은 찬성 사용하는 것이 좋습니다 CHOICE 의 사용을 통해 SET / P 다음과 같은 이유로 인해 :

  1. CHOICE 는 옵션 (및 ) 뒤에 지정된 키 (각각 STDIN 에서 읽은 문자) 만 허용 하고 사용자가 잘못된 키를 누르면 오류 경고음을 출력합니다./CCtrl+C
  2. CHOICE 는 허용되는 키 중 하나 이외의 다른 키를 누를 필요가 없습니다. CHOICE 는 허용 가능한 키를 누르면 즉시 종료되며 SET / P 는 사용자가 RETURN또는로 입력을 완료해야합니다 ENTER.
  3. 함께 것이 가능하다 CHOICE가 자동으로 사용자를 기다리지 않고 몇 초 후 기본 옵션을 계속하려면 기본 옵션 및 시간 제한을 정의 할 수 있습니다.
  4. 출력은 echo Y | call PromptExample.baton using CHOICE 와 같은 것을 사용하여 프롬프트가있는 배치 파일을 호출하는 다른 배치 파일에서 자동으로 프롬프트에 응답 할 때 더 좋습니다 .
  5. 사용자의 선택의 평가는 훨씬 쉽게 CHOICE 인해 초이스 에 할당 된 프레스 키 (문자)에 따라 값이 종료 ERRORLEVEL 쉽게 다음 평가 될 수있다.
  6. SET / P 에서 사용되는 환경 변수 는 사용자가 키만 누르 RETURN거나 ENTER사용자에게 메시지를 표시하기 전에 정의되지 않은 경우 정의되지 않습니다. SET / P 명령 줄 에서 사용 된 환경 변수는 이전에 정의 된 경우 현재 값을 유지하고 사용자는 RETURN또는 ENTER.
  7. 사용자는 구문 오류 로 인해 나중에 배치 파일 실행이 종료 되거나 배치 파일에 전혀 포함되지 않은 명령을 실행할 때 문자열을 포함하여 SET / P 로 프롬프트 될 때 무엇이든 자유롭게 입력 할 수 cmd있습니다. 좋은 코딩 된 배치 파일. 실수 또는 의도적으로 잘못된 사용자 입력으로 SET / P를 보호 하려면 약간의 노력이 필요 합니다.

다음은 Windows를 실행하는 중고 컴퓨터에서 사용할 수없는 기본 선택 및 대신 SET / P 를 사용하는 프롬프트 예 choice.exe입니다.

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

참고 : 이 배치 파일은 명령 인터프리터 command.com대신 사용 하는 Windows 95 / 98 / ME에서 사용할 수없는 명령 확장을 사용 합니다 cmd.exe.

Windows NT4 / 2000 / XP set "UserChoice=!UserChoice: =!"에서이 배치 파일을 호출 할 수 있도록 명령 줄 이 추가되었으며 . 두 문자열 비교를 실행하기 전에 STDIN 에서 읽은 문자열에서 모든 공백을 삭제합니다 .echo Y | call PromptExample.batecho Y| call PromptExample.bat

echo Y | call PromptExample.bat결과 Y는SPACE 환경 변수에 할당하기 UserChoice. "Y "대소 문자를 구분하지 "N"않거나 "Y"먼저 모든 공백을 삭제 하지 않기 때문에 프롬프트를 두 번 처리하게됩니다 . 그래서 UserChoiceYSPACE 값이 옵션을 사용하여 메시지를 두 번 실행 결과 것처럼 N두 번째 프롬프트 실행에 배치 파일에서 기본값으로 정의하는 배치 파일 처리의 예상치 못한 종료에서 다음 결과. 예, SET / P 의 안전한 사용 은 정말 까다 롭지 않습니까?

옵션 목록에서 사용자에게 선택하라는 메시지를 표시하기위한 SET / PCHOICE의 사용에 대한 자세한 내용은 Windows 명령 인터프리터가 잘못된 사용자 입력으로 배치 파일 실행을 종료하지 못하도록하는 방법에 대한 답변을 참조하십시오 .

더 많은 힌트 :

  1. IF 는 비교 연산자의 왼쪽과 오른쪽 두 문자열을 큰 따옴표 를 포함 하여 비교 합니다. 비교 대소 문자 구분은의 값이 아닙니다 그래서 UserChoice으로 N하고 Y있지만,의 값 UserChoice에 의해 둘러싸여 ""N"하고 "Y".
  2. IF의 비교 연산자 EQU와는 NEQ범위 내에서 두 개의 정수를 비교 -2147483648 2147483647에 대한 아니라 두 문자열을 비교하기위한 주요 설계되었습니다. EQU그리고는 NEQ정수로 왼쪽 문자열을 변환하는 쓸데없는 시도에서 따옴표로 문자열을 비교할에 문자열 비교를 위해도 작동하지만 결과. EQUNEQ활성화 명령 확장에서만 사용할 수 있습니다. 문자열 비교를위한 비교 연산자가 ==하고 not ... ==심지어 심지어 장애인 명령 확장과 함께 작동하는 command.comMS-DOS와 / 98 윈도우 95 / ME는 이미 지원. IF 비교 연산자 에 대한 자세한 내용 은 Windows 배치 파일에서 NEQ, LSS, GTR 등에 해당하는 기호를 참조하십시오 .
  3. 이 명령 goto :EOF은 실제로 배치 파일 처리를 종료하기 위해 활성화 된 명령 확장이 필요합니다. 자세한 내용 은 GOTO : EOF가 어디로 돌아가나요?를 참조하세요.

사용 된 명령과 작동 방식을 이해하려면 명령 프롬프트 창을 열고 다음 명령을 실행 한 다음 각 명령에 대해 표시된 모든 도움말 페이지를주의 깊게 읽으십시오.

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

또한보십시오:


1
이것은 놀라운 대답입니다. 지금부터는 Choice.exe 만 사용하고 있습니다.
Bas

choice.exe는 6.0 이후 DOS에서도 사용되었습니다
Brian Minton

@BrianMinton 맞지 않습니다. CHOICE.COMMS-DOS 6.0, MS-DOS 7.0, Windows 95 및 Windows 98에서는 기본적으로 16 비트 응용 프로그램 을 사용할 수있었습니다 . 그러나 choice.exeWindows NT4, Windows 2000 및 Windows XP에는 기본적으로 설치 되지 않았습니다 . CHOICE.COMNT4, Windows 2000 및 Windows XP에서도 사용할 수 있지만 choice.exe적절한 리소스 키트의 32 비트를 사용하는 것이 좋습니다 . CHOICE 에 대한 Rob van der Woude의 페이지를 참조하십시오 . 옵션은 다음과 부분적으로 다른 CHOICE.COMchoice.exe. 그러나 문제는 DOS에 관한 것이 아닙니다.
Mofi

5

여기에서 조금 더 쉽습니다.

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit

또는

@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no

Y 후 원하는 명령을 입력하십시오. 즉,이 ... :)위한거야
밥 스미스

내 말은 : %errorlevel%항상 정수 값입니다. 예제를 포함한 문서는 여기 를 참조 하십시오 .
Stephan

1

예 / 아니요 대답에 대한 나의 이동 방법은 다음과 같습니다 .

또한 대소 문자를 구분하지 않습니다.

이것은 입력에 의해 주어진 오류를 확인하고 choice변수를 필요한 것으로 설정 하여 코드 아래에서 사용할 수 있습니다.

@echo off
choice /M "[Opt 1]  Do you want to continue [Yes/No]"
if errorlevel 255 (
  echo Error
  ) else if errorlevel 2 (
  set "YourChoice=will not"
  ) else if errorlevel 1 (
  set "YourChoice=will"
  ) else if errorlevel 0 (
  goto :EOF
  )
  echo %YourChoice%
  pause

0

일괄 프로그램이 프롬프트로 돌아가고 프롬프트 (일명 cmd.exe)를 닫지 않도록하려면 "exit / b"를 사용할 수 있습니다.

이것이 도움이 될 수 있습니다.

set /p _sure="Are you sure?"
::The underscore is used to ensure that "sure" is not an enviroment
::varible
if /I NOT "_sure"=="y" (
::the /I makes it so you can
exit /b
) else (
::Any other modifications...
)

또는 많은 줄을 사용하지 않으려면 ...

Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.

도움이 되었기를 바랍니다...


0

다음은 Windows 10의 백업 (.bat / 배치) 스크립트에서 사용하는 간단한 예입니다. 이렇게하면 백업을 만들 때 다른 옵션을 사용할 수 있습니다.

...

:choice
set /P c=Do you want to rsync the archives to someHost[Y/N]?
if /I "%c%" EQU "Y" goto :syncthefiles
if /I "%c%" EQU "N" goto :doonotsyncthefiles
goto :choice

:syncthefiles
echo rsync files to somewhere ...
bash -c "rsync -vaz /mnt/d/Archive/Backup/ user@host:/home/user/Backup/blabla/"
echo done

:doonotsyncthefiles
echo Backup Complete!

...

이러한 블록은 필요한만큼 가질 수 있습니다.


0

먼저 터미널을 엽니 다.

그런 다음

cd ~
touch .sure
chmod 700 .sure

그런 다음 .sure를 열고 내부에 붙여 넣습니다.

#!/bin/bash --init-file
PS1='> '
alias y='
    $1
    exit
'
alias n='Taskkill /IM %Terminal% /f'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

그 후 파일을 닫습니다.

~/.sure ; ENTER COMMAND HERE

명령을 계속하기 전에 확실합니까?라는 메시지가 표시됩니다.


배쉬 일 수도 있지만, 확실히 배치는 아닙니다.
Stephan

오. 아닐 것 같아요. 배치 명령이 아닌 터미널 명령에 대해서만 작동합니다. 허위 정보로 죄송합니다.
user13636521

-1

터미널을 엽니 다. 다음을 입력하십시오

echo>sure.sh
chmod 700 sure.sh

이것을 sure.sh 안에 붙여 넣으십시오.

#!\bin\bash

echo -n 'Are you sure? [Y/n] '
read yn

if [ "$yn" = "n" ]; then
    exit 1
fi

exit 0

sure.sh를 닫고 터미널에 입력하십시오.

alias sure='~/sure&&'

이제 명령을 입력하기 전에 sure를 입력하면 명령을 계속하기 전에 확실합니까?라는 메시지가 표시됩니다.

도움이 되었기를 바랍니다.


배쉬 일 수도 있지만, 확실히 배치는 아닙니다.
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.