2011-12-12 68 views
1

我有一个批处理文件来帮助客户端自动备份他们的文件,但是它不会对他们编辑友好,所以我打算让客户端为其备份的目标驱动器输入一个字母。批处理文件输入验证和限制

的问题是,我不知道如何将他们的输入限制在只有一个字符,只有A-Z

我已阅读本资源> Batch File input validation - Make sure user entered an integer。但仍然无法找出任何解决方案

问题是,我们真的可以限制输入长度和验证的东西吗?有没有任何参考资料可以用于此事?

这里是我的代码

: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 
+0

您可以使用choise获取只有一个字符(Vista,Win7) – jeb

+0

但这将是约。 23选择,但我会尝试 – skeith

回答

4

以下使用基本的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% 
+0

您的解决方案更简单,喜欢它。但由于脚本的紧迫性,我不得不在没有用户输入的情况下修改脚本。不过,我打算用另一个用户输入 – skeith

+0

这个解决方案写的是区分大小写的 - 大写字母不起作用,但他们可能应该。 – dbenham

+0

@Gilles Arcas您可以分解“%choice:〜1,1%”==“”'限制输入为1个字符吗?另外,这听起来像'if'语句说'如果选择小于“a”并且大于“z”,请再试一次。“这是如何在a和z之间添加驱动器号的?和@dbenham,添加“IF/I”使其不区分大小写。 –

1

有没有办法做到这一点与原来的批处理命令;但是,您可以使用第三方程序。例如,批处理文件创建以下文件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读取一个密钥并在ERRORLEVEL中返回它的ASCII代码,密钥读取不会回显到屏幕上。你必须处理返回的值,以检查是到所需的范围,然后将其转换为等效的信:

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

在哪里可以得到这个“debug.com”?那些echo命令是做什么的?对此有何参考? – skeith

+0

它是最初用汇编语言编写的可执行程序(8字节长)的代码。您可能会从此网站获得DEBUG,但请先检查您的计算机中是否已安装:http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/debugx .zip – Aacini

+0

如何检查我是否有DEBUG? – skeith

1

如果你正在使用Vista或更高版本,可以使用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 

延迟扩展的情况下,建议条目的用户输入等​​

0

字符串另一变型可在使用ReadFormattedLine所有格式化输入的子程序。例如,下面的命令只要读过一个信:

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

这个子程序是用纯批所以它不需要任何额外的程序,它允许多个格式的输入操作,如读取密码。在前面的例子中,子程序在用户按下一个字母后自动继续,因此它不需要Enter键。你可以从Read a line with specific format下载ReadFormattedLine子程序。