글 쓴 이:allyesno bat 의 작은 게임 에서 숫자 를 맞 출 때 나 는 이 문 제 를 연구 한 적 이 있다. 어떻게 bat 에서 이 루어 집 니까? 입력 한 임의의 문 자 를 필터 링 합 니 다. 당시 사용 한 몇 가지 방법 은 다음 과 같다.Codz: if "%1"=="필터 할 문자" echo 당신 이 입력 한 것 은 불법 문자 입 니 다. 예: if "%1"=="wrongpassword" echo 잘못된 구령 set errorlevel=0 echo 필터 할 문자|find "걸 러 낼 문자" if "%errorlevel%"=="0" echo 당신 이 입력 한 것 은 불법 문자 입 니 다. if "%errorlevel%"=="1" echo 이 문자열 은 불법 목록 에 없습니다.주로 이 두 가지 방법 을 사용 합 니 다. 이 두 가지 방법 은 숫자 를 걸 러 낼 수 있다. 화해시키다 영문 자모 그러나. 맞다. 특수 문자 효과 가 없 으 면[+|-=\[]{}을 걸 러 야 합 니 다. 】(스페이스 바 와 tab 키 포함)시 우 리 는 이렇게 Codz: echo "anyword"|find ""anywrod"뭐 가 달라 요? 네,그렇습니다. 우 리 는"anyword"를 포함 하여 가입 했다. 필터 가 완료 되 지 않 았 습 니 다. 위 에서 필터 할 문자 발견 뭐 가 없어 요? 네,그렇습니다. 적다 문자 자체 안 타 깝 게 도 이런 방법 문자 자 체 를 완벽 하 게 걸 러 낼 수 없습니다. 당 하 다 값 을 얻다 기수 화해시키다 짝수의 때. find 로 진행 하 겠 습 니 다. 여과 조건 에 따르다 다 르 면 이 문 제 를 잘못 보고 할 수 있다. 괴롭히다 나 는 반년 동안 일찍이 코크스 위 에 있 었 다 물 어 봤 어 요. 아무 도 대답 하지 않 았 다. 사실 걸 러 야 돼 요. 그리 간단 하지 않다 우 리 는 먼저 비밀 번 호 를 검증 하 는 애플 릿 을 몇 개 썼 다. 서로 다른 상황 에서 프로그램의 반응 을 보 려 면 먼저 인증 암호 로그 인 애플 릿 주 를 작성 합 니 다.암호 인증 문자 가 p4nt0m 일 때 인증 로그 인 Codz: @echo off cls :allyesno set errorlevel=>nul echo 로그 인 암 호 를 입력 하 세 요 set/p password= echo "%password%"|findstr "ph4nt0m" if "%errorlevel%"=="0" echo 구령 이 맞다 end echo 구령 오류&goto allyesno :end echo 시스템 에 성공 적 으로 로그 인하 여 bat 를 key.bat 로 저장 하여 실행 결과 Codz: C:test>key 로그 인 암 호 를 입력 하 세 요 test 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0m "ph4nt0m" 구령 이 정확 하 다 시스템 로그 인 성공 사실 위. 위의 코드 는 일반적인 구령 검증 에 사용 하기에 충분 하 다. 그러나. 우리 의 목적 을 달성 해 야 한다. 임의의 문자 필터 가 아직 안 되 었 습 니 다.실행 결 과 를 바 꿔 보 겠 습 니 다.Codz: C:test>key 로그 인 암 호 를 입력 하 세 요 test 암호 오류 로그 인 암 호 를 입력 하 세 요 " """|findstr "ph4nt0m" 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0m "ph4nt0m" 구령 이 정확 하 다 시스템 에 성공 적 으로 로그 인 했 습 니 다.보 셨 습 니까? 우리 가 입력 하면" 문자 시간 절차 가 잘못 보고 되 었 다 비밀번호 표시 왜 이러 지? 우 리 는 이 문장의 문법 구 조 를 다시 보 았 다. echo "%password%"|findstr "ph4nt0m" %password%="일 때 echo """|findstr "ph4nt0m'이렇게 된 이유 echo 의 특성 과 관계 가 있 습 니 다. 우 리 는 다음 몇 개의 문 구 를 봅 시다.Codz: I:>echo "|cd "|cd I:>echo ""|cd I: I:>echo """|cd """|cd I:>echo """"|cd I:홀수 일 때 줄 인쇄 짝수 집행 하 다. | 문자 뒤의 명령 위 프로그램 에서 실 행 된 명령 은 cd 입 니 다. 제 가 echo 대신 set 로 했 어 요. 프로그램 은 다음 과 같 습 니 다 Codz: @echo off cls :allyesno set errorlevel=>nul echo 로그 인 암 호 를 입력 하 세 요 set/p password= set |findstr "ph4nt0m" if "%errorlevel%"=="0" echo 구령 이 맞다 end echo 구령 오류&goto allyesno :end echo 시스템 에 성공 적 으로 로그 인 한 결 과 는 다음 과 같 습 니 다.Codz: 로그 인 암 호 를 입력 하 세 요 test 암호 오류 로그 인 암 호 를 입력 하 세 요 " 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0m password=ph4nt0m 구령 이 정확 하 다 시스템 에 성공 적 으로 로그 인 하 였 습 니 다. C:\test>프로그램 이 완벽 해 졌 지만 문제 가 있 습 니 다 D 우리 다시 보 자. Codz 를 다른 방식 으로 실행 합 니 다: 로그 인 암 호 를 입력 하 세 요 test 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0mallyesno password=ph4nt0mallyesno 구령 이 정확 하 다 시스템 에 성공 적 으로 로그 인 하 였 습 니 다. C:test>프로그램의 검증 방식 은? set |findstr "ph4nt0m" 그래서 p4nt0m 문 자 를 포함 하 는 비밀 번호 모두 정확 한 비밀번호 로 여 겨 진다. 그래서 비밀번호 통 과 했 습 니 다.이 문 제 를 피하 기 위해 서. 설 치 했 습 니 다. 일치 하 는 매개 변수\<\> 데 이 터 를 검사 하 다. 수 정 된 프로그램 다음 Codz: @echo off cls :allyesno set errorlevel=>nul echo 로그 인 암 호 를 입력 하 세 요 set/p password= set |findstr "\
" if "%errorlevel%"=="0" echo 구령 이 맞다 end echo 구령 오류&goto allyesno :end echo 시스템 실행 결과 에 성공 적 으로 로그 인 하 였 습 니 다.Codz: 로그 인 암 호 를 입력 하 세 요 test 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0mallyesno 암호 오류 로그 인 암 호 를 입력 하 세 요 ph4nt0m password=ph4nt0m 구령 이 정확 하 다 시스템 에 성공 적 으로 로그 인 하 였 습 니 다. C:test>마지막 으로 프로그램 을 손질 하 다 아래 와 같다 Codz: @echo off cls :allyesno set errorlevel=>nul echo 로그 인 암 호 를 입력 하 세 요 set/p password= rem 암호 문자열 에 이 줄 의 모든 문자 가 포함 되 어 있다 면 +|-=[]{};':.../'>~!@\#$%^&*() +|-=[]{};':.../>? 일치 하 는 모드 를 사용 해 야 합 니 다<> rem 맞 춤 문자 필요 rem 암호 로 쓸 수 없 는 문자 " set password|findstr "\" if "%errorlevel%"=="0" echo 구령 이 맞다 end echo 구령 오류&goto allyesno :end set password=>nul echo 시스템 에 성공 적 으로 로그 인 하 였 습 니 다:암호 문자열 에 문자 가 있 을 때\\ 문 자 를 겹 쳐 써 야 합 니 다\\ 예. set password|findstr "\<\\\>" 로그 인 할 때 한 번 만 써 야 돼 요. 문자 암호 문자열 로 사용 할 수 없습니다. 암호 문자열 에 이 줄 의 모든 문자 가 포함 되 어 있다 면 +|-=[]{};':.../'>~!@\#$%^&*() +|-=[]{};':.../>? 일치 하 는 모드 를 사용 해 야 합 니 다\<\>