gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:40:27 29 4
gpt4 key购买 nike

你好,我正在编写一个将在 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:\> ...

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

C:\> script.bat "F:\music\data\"

我的第一次尝试是这样的:

@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!

主要 问题是当指定包含嵌入空格的路径时它不起作用:

C:\script.bat "C:\Documents and Settings"
...
'and' is not recognized as an internal or external command,
operable program or batch file.

因此,我尝试如下引用 %dir% 变量:

IF NOT EXIST "%dir%" GOTO :BadDirectory

当使用“IF NOT EXIST”直接检查文件时,上面的引用似乎有效,但当使用“dir\NUL”技巧检查目录时,它根本不起作用。

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

我们将非常感谢任何帮助或意见!

--签名:希望我正在编写 bash shell 脚本、ruby 或其他任何东西......

最佳答案

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

因此,CDPUSHD 在确定目录方面都非常聪明,而且工作起来很有魅力。

(注意:所有代码,包括测试都可以在 my 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

在我正确地完成所有测试用例后,它运行得非常好:

SUMMARY
Succeeded: 60
Failed: 0
-----------------
Total: 60

在您提问之前:是的,我已经在此处对批处理文件进行了单元测试。有人请为此杀了我。

另一个注意事项:我在 setlocal 之后省略了错误检查,因为只有当您打算在 DOS 或 Windows 9x/ME 上运行脚本时才需要它。由于这不可能工作,所以我倾向于总是将我的批处理文件命名为 .cmd 而不是 .batAMissico也注意到了这一点,但是出于错误的原因。 .cmd 作为扩展名的好处是 DOS 和 WinDOS 都不会尝试执行它。不需要包括错误处理,然后:-)

不过,总的来说,我认为您最好使用 VBScript 来完成此类任务。 Windows Script Host 包含在自 98 以来的所有 Windows 版本中(甚至 Win 7 仍然有它:-)),因此它是一个可靠的可靠平台。

关于windows - 如何通过 WinXP 批处理脚本可靠地验证目录的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413722/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com