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プロセッサはパス内のenv変数を展開しないと思います...どうすればできますか? あるいは、別の問題があるかもしれません。

または、どのように変数内で置き換えることができ!ます%か?

4

2 に答える 2

2

calla を使用して、テキスト ファイル内の変数を強制的に評価してみてください。

@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 setに aを追加して、ループからのリークsetlocal 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 に答える