Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何让从文件中读取的百分比符号(%)在Windows批处理文件中展开?_Batch File - Fatal编程技术网

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

Batch file 如何让从文件中读取的百分比符号(%)在Windows批处理文件中展开?,batch-file,Batch File,这是文件path.txt: %APPDATA%\foo 这是批处理文件读取路径.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 paus

这是文件
path.txt

%APPDATA%\foo
这是批处理文件
读取路径.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()!
因此,如果文件夹路径另外包含零个或多个环境变量引用,并且还包含一个百分号,该百分号应被逐字解释为文件夹名称的一部分,则代码不起作用

命令调用左至
设置“FolderPath=!FolderPath!”
将解释从文件读取的文件夹路径中的百分号,并展开环境变量引用,但也可以删除一个百分号,该百分号应解释为文字字符,而不是环境变量引用的开始/结束。
cmd.exe
不应在当前目录中找到名为
set
的文件,也不应在环境变量
PATH
中列出文件扩展名为环境变量
PATHEXT
的目录中找到,因为在这种情况下,将调用此可执行文件或脚本,而不是执行内部命令设置

根据Microsoft关于的文档,用于获取真正的绝对文件夹路径的内部,从包含相对路径部分的文件读取的文件夹路径始终以单个反斜杠结尾

注意:环境变量
foodir
的定义始终以反斜杠结尾

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
  • echo/?
  • endlocal/?
  • 退出/?
  • 如果/?
  • 暂停/?
  • 设置/?
  • setlocal/?