检查目录或文件名的绝对路径是否有效

时间:2016-07-03 10:50:50

标签: validation batch-file filenames absolute-path

我正在创建一个bat脚本,我应该检查变量是否包含目录的有效绝对路径,以及另一个变量是否包含Windows 8及更高版本的文件的有效名称。

那么,我该如何进行这些检查?

由于

再见

2 个答案:

答案 0 :(得分:6)

这比大多数人意识到的要复杂得多。在SO和其他地方有很多关于这个主题的错误信息。有很多"解决方案"看似有效,但在某些情况下会失败。

问题可以分为两部分:

1)绝对或相对

你不能简单地使用FOR变量" %% ~fF"将路径转换为完整路径。或参数"%~f1"并测试它是否与原始字符串匹配(忽略大小写),因为可以通过无数种方式写入绝对路径。有效的绝对路径可以包含任意数量的\..\\.\。此外,绝对路径可以使用驱动器号,也可以是UNC路径。此外,绝对路径可以包含任意数量的"

我通过先删除所有引号来测试路径是绝对路径还是相对路径,然后我使用FINDSTR来测试它是否以下列任何一个开头:

  • 驱动器号,后跟冒号,然后是反斜杠
  • 两条反斜杠

2)文件或文件夹或不存在

使用IF EXISTS path来判断路径是否有效很容易。但是将文件与文件夹区分开来比较困难。

回到DOS的时代,您可以检查path\NUL是否存在,如果存在,那么您就知道该路径是一个文件夹。不幸的是,许多人都误以为这在Windows下运行 - 在Windows下不可靠

另一种常见的尝试是测试path\是否存在,如果存在,则假设它必须是文件夹。这通常似乎有效,但如果路径涉及目录符号链接或联结 ,则 不起作用

我将使用的分类代码与https://stackoverflow.com/a/8669636/1012053几乎相同,除了我已将其用于环境变量而不是批处理参数。

我使用FOR变量~a修饰符来查看文件/文件夹属性。如果我找到d,那么它就是一个文件夹。如果我找到没有d的属性,那么它就是一个文件。否则,如果我找不到属性,那么它就不存在了。

准确判断文件夹是否存在的另一种方法是测试path\*是否存在,但我对此方法的经验较少。

所以把它们放在一起,我得到了

@echo off
setlocal
set var=test.bat

setlocal enableDelayedExpansion

:: Determine absolute or relative
echo(!var:^"=!|findstr /i "^[A-Z]:[\\] ^[\\][\\]" >nul && set "type=absolute" || set "type=relative"

:: Determine file or folder or not exists
for /f eol^=^ delims^= %%F in ("!var!") do (
  for /f "tokens=1,2 delims=d" %%A in ("-%%~aF") do if "%%B" neq "" (
    echo %%F = %type% folder
  ) else if "%%A" neq "-" (
    echo %%F = %type% file
  ) else (
    echo %%F does not exist
  )
)

答案 1 :(得分:0)

这是不言自明的代码。 它期望包含要检查的路径的参数。

set "INPUT_PATH=%~1"
set "FULL_PATH=%~f1"
set "SHORT_PATH=%~s1"
if /i "%INPUT_PATH%"=="%FULL_PATH%" echo this is a full path 
if exist "%INPUT_PATH%" echo this is an existing path
if exist %SHORT_PATH%\NUL echo this is a directory