1 validation filenames batch-file absolute-path
我正在创建一个bat脚本,我应该检查变量是否包含目录的有效绝对路径,以及另一个变量是否包含Windows 8及更高版本的文件的有效名称.
那么,我该如何进行这些检查呢?
谢谢
再见
这比大多数人意识到的要复杂得多.在SO和其他地方有很多关于这个主题的错误信息.有许多"解决方案"似乎有效,但在某些情况下会失败.
问题可分为两部分:
1)绝对或相对
你不能简单地使用FOR变量"%% ~fF"或参数"%~f1"将路径转换为完整路径并测试它是否与原始字符串匹配(忽略大小写),因为绝对数量绝对是绝对的路径可以写.有效的绝对路径可以包含任何数量\..\或\.\在其中.此外,绝对路径可以使用驱动器号,也可以是UNC路径.此外,绝对路径可以包括其中的任何数量".
我通过首先删除所有引号来测试路径是绝对路径还是相对路径,然后我使用FINDSTR来测试它是否以下列任何一个开头:
2)文件或文件夹或不存在
可以很容易地IF EXISTS path判断路径是否有效.但是将文件与文件夹区分开来更加困难.
回到DOS的时代,您可以检查是否path\NUL存在,如果存在,那么您就知道该路径是一个文件夹.不幸的是,许多人都误以为这在Windows下运行 - 在Windows下它不可靠
另一种常见的尝试是测试是否path\存在,如果存在,则假设它必须是文件夹.这通常似乎有效,但如果路径涉及目录符号链接或联结,则它不起作用
我将使用的分类代码几乎与/sf/answers/606874551/相同,除了我已采用它与环境变量而不是批处理参数.
我使用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
)
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |