如何通过WinXP批处理脚本可靠地验证目录的存在?

chi*_*npo 3 windows scripting batch-file

你好,我正在编写一个可以在Windows XP机器上运行的批处理脚本.此脚本需要能够可靠地验证作为命令行参数传递的目录确实存在.

假设我的脚本名为script.bat,它需要支持以下作为合法的命令行参数:

C:\> script.bat C:
C:\> script.bat C:\
C:\> script.bat ..\photos
C:\> script.bat C:\WINDOWS
C:\> script.bat "C:\Documents and Settings"
C:\> script.bat "C:\Documents and Settings\"
C:\> script.bat F:\music\data\
C:\> ...
Run Code Online (Sandbox Code Playgroud)

基本上,给一个带有或不带尾随反斜杠的驱动器号以及完整的,绝对的或相对的路径名,带或不带尾随反斜杠(在某些目录名中有或没有空格)是合法的. )).如果它包含空格以便被解释为一个参数,那么显然必须引用该名称.但是,如果没有其他要求,则应允许引用名称:

C:\> script.bat "F:\music\data\"
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试看起来像这样:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
IF ErrorLevel 1 GOTO :NoExtensions
IF "%~1"=="" GOTO :NoDirectory

SET dir=%~1\NUL
ECHO You provided:  %1
ECHO Testing using: %dir%
IF NOT EXIST %dir% GOTO :BadDirectory
SET dir=%~f1\
ECHO The following is valid: %dir%

REM
REM Other script stuff here...
REM

GOTO :EOF
:NoExtensions
    ECHO This batch script requires extensions!
    GOTO :EOF
:NoDirectory
    ECHO You must provide a directory to validate!
    GOTO :EOF
:BadDirectory
    ECHO The directory you specified is invalid!
Run Code Online (Sandbox Code Playgroud)

主要问题是,当被指定带空格的路径它不工作:

C:\script.bat "C:\Documents and Settings"
...
'and' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

所以,我尝试引用%dir%变量,如下所示:

IF NOT EXIST "%dir%" GOTO :BadDirectory
Run Code Online (Sandbox Code Playgroud)

当使用"IF NOT EXIST"直接检查文件时,如上所述引用似乎有效,但在使用"dir\NUL"技巧检查目录时它根本不起作用.

原始版本中的另一个小故障是,如果%1是C:那么变量的%~f1版本似乎总是产生我当前的工作目录而不是C:或C:\,因为它会更有用.我也不确定解决这个问题的最佳方法.

任何帮助或意见将大大赞赏!

- 签名:希望我写的是bash shell脚本,ruby或其他任何东西......

Joe*_*oey 8

我找到了批处理文件的工作解决方案.它根本不涉及使用IF EXIST,而是滥用PUSHD.我试图哄骗IF EXIST工作时略微摸索,但在90%的失败和50%的成功之间摇摆不定.呸.然后我注意到我可以尝试进入该目录以检查它是否存在.这需要几乎相同的限制,例如检查"dir \nul"是否存在,因为您需要查看目录内部的权限.例如,两次尝试都失败了,例如系统卷信息.但这不是问题所在.

因此CD,PUSHD在找出目录时它们都很聪明,它就像一个魅力.

(注意:所有代码,包括测试都可以在我的SVN中找到).

@echo off
setlocal enableextensions
rem this one works reliably
if "%~1"=="" goto NoDirectory

pushd %1 2>nul && popd || goto :BadDirectory

echo DOES EXIST

endlocal
goto :eof

:NoDirectory
echo NO DIR
exit /b 1

:BadDirectory
echo DOES NOT EXIST
exit /b 1
Run Code Online (Sandbox Code Playgroud)

在我完成所有测试用例后,它的工作原理非常好:

SUMMARY
   Succeeded: 60
   Failed:    0
   -----------------
   Total:     60
Run Code Online (Sandbox Code Playgroud)

在你问之前:是的,我在这里对批处理文件进行了单元测试.有人请为此杀了我.

另一个注意事项:我之后遗漏了错误检查,setlocal因为如果您打算在DOS或Windows 9x/ME上运行脚本,您只需要这样做.由于这不可行,我倾向于总是命名我的批处理文件.cmd而不是.bat.AMissico也指出,但出于错误的原因..cmd作为扩展的好处是DOS和WinDOS都不会尝试执行它.不需要包含错误处理,然后:-)

但是,一般情况下,我认为最好使用VBScript执行此类任务.自98年以来,Windows脚本主机包含在所有版本的Windows中(即使Win 7仍然拥有它:-))因此它是一个可靠的平台.