这是文件
path.txt
:
%APPDATA%\foo
这是批处理文件的一部分
read-path.bat
:
...
for /f %%i in (path.txt) do if not defined fooDir (
if exist %%i (
set "fooDir=%%i"
) else (
>&2 echo ERROR: Invalid definition of fooDir: %%i
pause
popd
exit /b 1
)
)
...
当我运行这个批处理文件时,它提示
ERROR: Invalid definition of fooDir: %APPDATA%\foo
如何让它解析为
C:\Users\user\AppData\Roaming\foo
,而不是 %APPDATA%\foo
?
可以使用以下代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "usebackq eol=| delims=" %%i in ("%~dp0path.txt") do if not defined fooDir (
set "FolderPath=%%~i"
setlocal EnableDelayedExpansion
call set "FolderPath=!FolderPath!"
for %%j in ("!FolderPath!\") do (
endlocal
if exist "%%~fj" (
set "fooDir=%%~fj"
) else (
endlocal
>&2 echo ERROR: Invalid definition of fooDir: %%j
pause
exit /B 1
)
)
)
set foodir
endlocal
该代码适用于批处理文件目录中
path.txt
中的以下文件夹路径:
%APPDATA%\foo
%APPDATA%\Development & Test()!
%APPDATA%\..\Roaming\Development & Test()!\\\
但它不适用于:
%APPDATA%\Development % Test()!
因此,如果文件夹路径另外包含零个或多个环境变量引用以及百分号(应按字面解释为文件夹名称的一部分),则该代码将不起作用。
命令 CALL 左边到
set "FolderPath=!FolderPath!"
会导致解释从文件读取的文件夹路径中的百分号并扩展环境变量引用,而且还会删除应解释为文字字符而不是开始的单个百分号/ 环境变量引用的结尾。 cmd.exe
不应在当前目录或环境变量 set
中列出的目录中找到名称为 PATH
且文件扩展名在环境变量 PATHEXT
中列出的文件,因为在这种情况下,此可执行文件或脚本将被称为而不是执行内部命令SET。
内部 FOR 用于获取真正的绝对文件夹路径,该路径始终以从文件读取的文件夹路径上的单个反斜杠结尾,包含相对路径部分以及根据有关命名文件、路径和命名空间的 Microsoft 文档。
注意: 环境变量
foodir
的定义始终以反斜杠结尾。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
echo /?
endlocal /?
exit /?
if /?
pause /?
set /?
setlocal /?