我看到了批处理文件的问题。我试过搜索了几个小时但是,我找不到与我的问题有关的任何内容。所以这是我的代码(英语不是我的第一语言,请耐心等待):
:fileexist
For %%f in ("bin/*.exe") do (
set /A count+=1
set c!count!=%%f
)
Set "input="
Set /P input= Select
If "!input!" GTR "!count!" (Goto :fileexist)
If "!input!" EQU "0" (Set Exe=No executable file) & (Goto :nofileexist)
If "!input!" LSS "1" (Goto :fileexist)
If "!input!" LEQ "!count!" (Set Exe=!c%input%!) & (Goto :gotfile)
Goto :fileexist
现在我默认在该文件夹(bin)中有三(3)个可执行文件,这只是一个例子,因为客户端有3个以上或更少。现在放开这个例子,如果我输入正确(1,2或3)并选择文件但代码工作正常,但如果我输入(12,13,14 ..)它仍然选择第一个文件注意这是有效的只要第一个数字是“1”,任何数字都可以。
同样地,如果我输入(21,22,23 ......等),它选择第二个文件并且与此相同,只要第一个数字是“2”,它就可以使用任何数字,但现在是“3”并猜猜是什么?它不会接受任何更高的数字,不管它(31,32,4000 ......或者是......)是否接受“3”以上的任何数字并且这是我想要的但是,我也希望它不接受其他数字之类的(12,1400,23,27555 ......等)。
我花了好几个小时试图搞清楚,但没有运气,这就是为什么这是我最后的希望,涉及以下内容:
我很抱歉文字墙和我的英语,当然。如果有什么问题让我感到困惑,请告诉我,感谢您抽出时间。如果我们都能找出这个原因的根源并想出一个解决方案,我们将不胜感激。谢谢。
答案 0 :(得分:2)
以下是基于批次代码的批次代码,其中包含对输入的用户输入的大量验证。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:RunAgain
set "Count=0"
for %%F in ("bin\*.exe") do (
set /A Count+=1
set "File!count!=%%~fF"
)
:EnterNumber
rem Define as default value a double quote.
set "Input=""
rem Ask user for entering a number.
set /P "Input=Enter number between 0 and %Count%: "
rem Remove double quotes if entered by user if entered anything at all.
rem This removal of all double quotes in entered string would result in
rem a syntax error if default value for Input is not a double quote and
rem the batch user hits just RETURN or ENTER without entering anything.
set "Input=%Input:"=%"
rem Let user enter the number again if nothing was entered by the user.
if not defined Input goto EnterNumber
rem Check if entered string consists of only digits, i.e. is a positive number.
set "NoneDigit="
for /F "delims=0123456789" %%N in ("%Input%") do set "NoneDigit=1"
rem Let user enter the number again if entered string was not a positive number.
if defined NoneDigit goto EnterNumber
rem Remove leading zeros to avoid number being interpreted as octal number.
set "Number="
for /f "tokens=* delims=0" %%N in ("%Input%") do set "Number=%%N"
rem Is the entered number 0?
if not defined Number (
set "Executable=No executable file"
goto NoExecutable
)
rem Has the user entered a too large number.
if %Number% GTR %Count% goto EnterNumber
set "Executable=!File%Number%!"
echo Selected EXE is: %Executable%
rem Do whatever should be done with this executable.
goto RunAgain
:NoExecutable
echo No executable selected.
:ExitBatch
endlocal
以命令 rem 开头的注释行(是的,这是一个命令)应该解释重要的块。
删除前导零的循环取自Remove leading zeros in batch file上的答案。
有关此批处理代码的更多详细信息,请打开命令提示符窗口,输入以下命令,并阅读每个命令的帮助输出。
for /?
goto /?
if /?
set /?
setlocal /?
答案 1 :(得分:1)
批处理变量被视为字符串,除非它们被明确地视为数字。在这种情况下,if
语句中的引号强制变量被视为字符串,因为引号不是整数。因此,正在进行字符串比较,其中变量被一次比较一个字符,这意味着12在2之前,因为1小于2。
If !input! GTR !count! (Goto :fileexist)
If !input! EQU 0 (Set Exe=No executable file) & (Goto :nofileexist)
If !input! LSS 1 (Goto :fileexist)
If !input! LEQ !count! (Set Exe=!c%input%!) & (Goto :gotfile)