0

我在以下示例中遇到了麻烦。我有一个包含文件名列表的文件。我想检查这些文件是否存在,例如:

%ProgramFiles%\Internet Explorer\iexplore.exe
%SystemRoot%\sdfsdfsd.exe
%SystemRoot%\explorer.exe

每个路径都包含环境变量。

我的bat文件示例:

echo off  
for /f "tokens=*" %%a in (filelist.txt) do (  
  if exist "%%~a" (  
    echo %%~a exists  
  ) else (  
    echo %%~a doesn't exists  
  )  
)

文件名已正确加载,但我 cmd 找不到所有文件。我认为 cmd 处理器不会在路径中扩展环境变量......我该怎么做?或者可能还有其他问题。

或者我如何在变量中替换!为其他?%

4

2 回答 2

2

尝试使用 acall来强制评估文本文件中的变量。

@echo off
setlocal
for /f "tokens=*" %%a in (filelist.txt) do (
    call :checkExists "%%~a"
)
goto :EOF

:checkExists <filename>
if exist %1 (
    echo %~1 exists
) else (
    echo %~1 doesn't exists
)
goto :EOF
于 2013-02-27T15:38:06.470 回答
2

rojo已经有了正确的想法,但没有必要求助于子程序。当与例如命令call一起使用时,也会导致嵌套变量的扩展。set

@echo off

setlocal EnableDelayedExpansion

for /f "tokens=*" %%a in (filelist.txt) do (
  call set fname=%%~a
  if exist "!fname!" (
    echo %%~a exists.
  ) else (
    echo %%~a doesn't exist.
  )
)

endlocal

编辑:正如@dbenham 所指出的,上述代码中的延迟扩展将导致感叹号从文件名中消失。这可以通过setlocal EnableDelayedExpansion在循环内移动指令并在前面加上call setasetlocal DisableDelayedExpansion以防止%fname%泄漏到循环外来缓解。

@echo off

for /f "tokens=*" %%a in (filelist.txt) do (
  setlocal DisableDelayedExpansion
  call set fname=%%~a
  setlocal EnableDelayedExpansion
  if exist "!fname!" (
    echo %%~a exists.
  ) else (
    echo %%~a doesn't exist.
  )
  endlocal
)
于 2013-02-27T20:18:05.990 回答