Проверка и ограничение ввода командного файла - PullRequest
1 голос
/ 12 декабря 2011

У меня есть пакетный файл, который помогает клиентам выполнять автоматическое резервное копирование своих файлов, однако он не подходит для редактирования, поэтому я планирую сделать так, чтобы клиенты вводили букву для целевого диска своей резервной копии.

Проблема в том, что я не знаю, как ограничить их ввод только одним символом и только az

Я прочитал этот ресурс> Проверка ввода командного файла - убедитесь, что пользователь ввел целое число .Но все еще не может найти какое-либо решение

Вопрос в том, можем ли мы действительно ограничить длину ввода и возможность проверки?Есть ли какие-либо ссылки можно использовать по этому вопросу?

вот мой код

:init
@echo off
color 02

REM -- set vars
set tgl=%DATE:~0,2%
set bln=%DATE:~-7,2%
set thn=%DATE:~-4,4%
set jam=%TIME:~0,2%
if "%time:~0,1%"==" " set jam=0%TIME:~1,1%
set menit=%TIME:~3,2%
set detik=%TIME:~6,2%



echo Under which drive will you save the backup? ( one letter only, a-z )
set /p drive=
pause
cls
:stopsvc
net stop svc01
cls
echo stop service   [OK]
echo copy files     [ ]
echo start service  [ ]
echo archiving  [ ]
echo.
REM -- start backup
echo.
:copy
echo copying ...
xcopy /e /y c:\docs %drive%:\data\docs\
cls
echo stop service   [OK]
echo copy files     [OK]
echo start service  [ ]
echo archiving  [ ]
echo.
echo.
:startsvc
echo starting MySQL service...
net start svc01
if errorlevel = 1 goto svcfail
echo.
echo done
cls
echo stop service   [OK]
echo copy files     [OK]
echo start service  [OK]
echo archiving  [ ]
echo.
echo.
echo backup successfully created
echo now archiving ...
echo.
:archive
cd "%drive%:\data"
ren "docs" "BACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%"
echo archiving - OK
cls
echo stop service   [OK] > "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo copy files     [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo start service  [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo archiving  [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo. 
echo.
echo buhbye
echo copyright(c) [SC] 2010-2011
pause
goto eof

:svcfail
echo cannot start svc01 service > "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo start it manually through services.msc >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo.
echo.
echo stop service   [OK]
echo copy files     [OK]
echo start service  [FAIL]
echo archiving  [ ]
pause
goto archive1
:archive1
cd "%drive%:\data"
ren "docs" "BACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%"
echo archiving - OK
cls
echo stop service   [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo copy files     [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo start service  [FAIL] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo archiving  [OK] >> "logBACKUP-[%jam%.%menit%]-%tgl%-%bln%-%thn%.txt"
echo.
echo.
echo all done~!
pause
goto eof



:eof
exit

Ответы [ 4 ]

4 голосов
/ 15 декабря 2011

Ниже используется базовый синтаксис cmd. Он будет повторяться до тех пор, пока пользователь не введет один символ в нижнем регистре.

:choice
set /p choice=Under which drive will you save the backup? ( one letter only, a-z )
if not "%choice:~1,1%"=="" goto choice
if "%choice%" lss "a" goto choice
if "%choice%" gtr "z" goto choice
set drive=%choice%
1 голос
/ 12 января 2012

Если вы используете Vista или более позднюю версию, вы можете использовать команду CHOICE (введите «CHOICE /?» Для документации). По умолчанию CHOICE не учитывает регистр, что, на мой взгляд, хорошо для вашей ситуации.

setlocal enableDelayedExpansion
set "choices=abcdefghijklmnopqrstuvwxyz"
echo Under which drive will you save the backup? ( one letter only, a-z )
choice /c %choices% /n
set /a "n=%errorlevel%-1"
set "drive=!choices:~%n%,1!"

Ниже приведен вариант стратегии Giles Arcas для проверки записей после ввода, которая допускает как прописные, так и строчные буквы.Он также немного более надежен в том смысле, что он правильно обрабатывает пустые строки.Это должно работать на XP и более поздних версиях.

setlocal enableDelayedExpansion
set "choices=abcdefghijklmnopqrstuvwxyz"
:select
echo Under which drive will you save the backup? ( one letter only, a-z )
set "drive="
set /p "drive="
for /l %%N in (0 1 25) do if /i "!choices:~%%N,1!"=="%drive%" goto :continue
goto :select
:continue

Вот еще один вариант, который использует регулярное выражение FINDSTR для проверки записи

setlocal enableDelayedExpansion
:select
echo Under which drive will you save the backup? ( one letter only, a-z )
set "drive="
set /p "drive="
echo !drive!|findstr /r /i "^[abcdefghijklmnopqrstuvwxyz]$" >nul || goto :select

Рекомендуется отложенное расширение, если пользователь вводитстрока типа "&"&

1 голос
/ 13 декабря 2011

Нет способа сделать это с оригинальными командами BATCH; однако вы можете использовать стороннюю программу. Например, пакетный файл ниже создает файл GETKEY.COM:

@ECHO OFF
REM CREATE THE GETKEY.COM AUXILIARY FILE
(
ECHO E100
ECHO B4 08 CD 21 B4 4C CD 21
ECHO RCX
ECHO 8
ECHO W
ECHO Q
) | DEBUG GETKEY.COM > NUL

Вы должны иметь DEBUG.COM, чтобы это работало. GETKEY читает ключ и возвращает его ASCII-код в ERRORLEVEL, чтение ключа НЕ отображается на экране. Вы должны манипулировать возвращаемым значением, чтобы проверить, находится ли он в требуемом диапазоне, а затем преобразовать его в эквивалентную букву:

set aLetter=97
set zLetter=122
set lowcaseLetters=a b c d e f g h i j k l m n o p q r s t u v w x y z

REM Read a key and check that it is in range
:readKey
getkey
set key=%errorlevel%
if %key% LSS %aLetter% goto readKey
if %key% GTR %zLetter% goto readKey

REM Convert ASCII code to an index between 1 and 26
set /A index=key-aLetter+1

REM Get the letter and echo it in the screen
for /F "tokens=%index%" %%a in ("%lowcaseLetters%") do set letter=%%a
echo %letter%

Вы даже можете обрабатывать функциональные и специальные клавиши таким образом ...

0 голосов
/ 17 июля 2014

Вы можете использовать подпрограмму ReadFormattedLine для всех видов форматированного ввода. Например, команда ниже читает только одну букву:

call :ReadFormattedLine drive="L" /M "Under which drive will you save the backup? "

Эта подпрограмма написана в чистом пакетном режиме, поэтому она не требует какой-либо дополнительной программы и допускает несколько форматированных операций ввода, таких как чтение паролей. В предыдущем примере подпрограмма автоматически продолжалась после нажатия пользователем буквы, поэтому для нее не требуется клавиша Enter. Вы можете скачать подпрограмму ReadFormattedLine из Читать строку с определенным форматом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...