如何让从文件中读取的百分比符号 (%) 在 Windows 批处理文件中展开?

问题描述 投票:0回答:1

这是文件

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

batch-file
1个回答
1
投票

可以使用以下代码:

@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 /?
© www.soinside.com 2019 - 2024. All rights reserved.