如果不存在则提示用户选择目录

时间:2014-02-13 18:29:45

标签: batch-file if-statement for-loop scripting directory

如果我要创建一个用户按编号选择目录的条件,我该如何测试以确保它有效? 换句话说,如果提示用户:

  1. C:\ Program Files
  2. C:\使用用户数据
  3. 请选择目录: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个子例程中的一个,因此这些是正确的变量。

    知道如何完成这项任务吗?

4 个答案:

答案 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