如果我要创建一个用户按编号选择目录的条件,我该如何测试以确保它有效? 换句话说,如果提示用户:
请选择目录:3
在这个独特的场景中,我该如何测试并告知用户3是一个错误的选择,然后循环回子程序? 因为我认为“如果不存在”会起作用,我有点死路一条。
我尝试了以下但没有成功:
如果%errorlevel%equ 1(命令)else(命令)
如果errorlevel 1(命令)else(命令)
如果不存在!acctDir !! userDir! (命令)else(命令)。
这就是我所拥有的:
:dir
echo.
set c=0
For /f %%a in ('dir !acctDir! /B /A:D') do (
set /a c+=1
echo !c! %%a >>!log!
echo !c! %%a
set dir!c!=%%a
)
echo.
set /p userIn=" Please select a directory [1-!c!]: "
set userDir=!dir%userIn%!
echo ***DEBUG*** Path=[!acctDir!\!userDir!]
pause
if not exist "!acctDir!\!userDir!" (
echo.
echo That is not a valid selection. Please try again. >>!log!
echo That is not a valid selection. Please try again.
echo.
ping 127.0.0.1 -n 3 -w 1000 >nul
cls
goto dir
) else (
echo.
echo You selected !userDir! for your data retrieval. >>!log!
echo You selected !userDir! for your data retrieval.
echo.
ping 127.0.0.1 -n 3 -w 1000 >nul
goto string
)
)
当我执行一些DEBUG测试以在IF语句运行之前回显路径时,我得到:
1 Jan_14_2014_12_49_11_900PM
2 Jan_20_2014_6_56_55_953PM
Please select a directory [1-2]: 3
***DEBUG*** Path=[x:\101004357\]
Press any key to continue . . .
因此,它返回一个具有帐号而不是子目录的路径,因为显而易见的原因,因为输入3什么都不是。但是,如果不存在则应该遵循,对吗?
我不认为Windows知道这些数字与子目录有关吗?
所以,我需要一个条件说明,如果不存在任何子目录(我认为它是变量!userDir!)。但是!userDir!被分配为什么都没有,所以这就是为什么它不起作用。然后我想我需要得到一个子目录列表来运行这个语句。
**这只是12个子例程中的一个,因此这些是正确的变量。
知道如何完成这项任务吗?
答案 0 :(得分:1)
如果有NULL输出,我可以通过解决问题来解决问题。在括号周围设置变量并将其设置为等于由空括号括起的空输出允许我针对用户输入进行测试。
只需执行以下操作:
if [!userDir!]==[] (
echo.
echo That is not a valid selection. Please try again. >>!log!
echo That is not a valid selection. Please try again.
echo.
ping 127.0.0.1 -n 3 -w 1000 >nul
cls
goto dir
) else (
echo.
echo You selected !userDir! for your data retrieval. >>!log!
echo You selected !userDir! for your data retrieval.
echo.
ping 127.0.0.1 -n 3 -w 1000 >nul
goto string
)
)
答案 1 :(得分:0)
试试这个:
@echo off
setlocal Enabledelayedexpansion
set c=0
set "acctDir=U:\scripts\batch"
For /f %%a in ('dir !acctDir! /B /A:D') do (
set /a c+=1
echo !c! %%a
set dir!c!=%%a
set valid=!valid! !c!
)
:StartOver
set /p userIn=" Please select a directory [1-!c!]: "
set userDir=!dir%userIn%!
REM echo valid=%valid%
for %%a in (%valid%) do (
if %userIn% NEQ %%a (
set txt=!userIn! is not a valid selection. Please try again.
) ELSE (
set txt=You selected !userDir! for your data retrieval.
Goto :out
)
)
:out
If "%txt:~0,3%" EQU "You" Echo %txt%
if "%txt:~0,3%" NEQ "You" Echo %txt% & goto :StartOver
答案 2 :(得分:0)
这应该有效:尾部反斜杠只测试文件夹而不是文件名。
If not exist "!acctDir!\!userDir!\" (command) else (command)
答案 3 :(得分:0)
@ECHO OFF
SETLOCAL
SET acctdir=.
:: remove variables starting $
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
SET "$alphabet=0 1 2 3 4 5 6 7 8 9 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"
FOR /f "delims=" %%a IN ('dir "%acctDir%" /B /A:D') DO CALL :setchoices "%%a"
IF NOT DEFINED $_%$alphabet:~0,1% GOTO :EOF
FOR /f "tokens=2*delims=_=" %%a IN ('set $_') DO ECHO(%%a : %%b
choice /c %$$% /m "Choose from menu "
SET /a chosen=%ERRORLEVEL%-1
CALL SET $$=%%$$:~%chosen%,1%%
CALL SET $$=%%$_%$$%%%
ECHO CD "%acctDir%\%$$%"
GOTO :EOF
:setchoices
FOR %%i IN (%$alphabet%) DO IF NOT DEFINED $_%%i (
SET "$_%%i=%~1"
SET "$$=%$$%%%i"
GOTO :EOF
)
GOTO :eof
这有效 - 我使用.
作为acctdir
进行测试。您在$alphabet
目标目录echo
ed - 在echo
激活之前删除cd
。