2011-12-12 52 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子程序。