当检查读取路径的实际存在时,通过读取不工作的列表文件打印文件列表



正如我在Q-title中提到的,我正试图从一个列表文件中读取一些文件路径,我打算稍后删除这些路径,该列表文件包含由newline分隔的路径,如下[ChromeJunks.lst]:

%LOCALAPPDATA%GoogleChromeUser DataDefaultHistory
%LOCALAPPDATA%GoogleChromeUser DataDefaultHistory-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultNetwork Action Predictor
%LOCALAPPDATA%GoogleChromeUser DataDefaultNetwork Action Predictor-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultTop Sites
%LOCALAPPDATA%GoogleChromeUser DataDefaultTop Sites-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultVisited Links
%LOCALAPPDATA%GoogleChromeUser DataDefaultFavicons
%LOCALAPPDATA%GoogleChromeUser DataDefaultFavicons-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultWeb Data
%LOCALAPPDATA%GoogleChromeUser DataDefaultWeb Data-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultLog
%LOCALAPPDATA%GoogleChromeUser DataDefaultLog.old
%LOCALAPPDATA%GoogleChromeUser DataDefaultQuotaManager-journal
%LOCALAPPDATA%GoogleChromeUser DataDefaultQuotaManager
%LOCALAPPDATA%GoogleChromeUser DataDefaultLOCK
%LOCALAPPDATA%GoogleChromeUser DataDefaultBookmarks.bak
%LOCALAPPDATA%GoogleChromeUser DataDefaultAffiliation Database

现在这个列表文件和我的批处理脚本在同一个文件夹中,它试图逐行读取这个列表文件,并检查这些路径是否真的存在,如果存在,则打印这些文件路径(我打算稍后删除这些文件路径(,批处理代码如下:

@echo off && setlocal enabledelayedexpansion
if exist "%~dp0ChromeJunks.lst" ( set "Junks=%~dp0ChromeJunks.lst" )
for /f "tokens=* delims=," %%a in (%Junks%) do ( if exist "%%a" echo "%%a" )
endlocal && pause && exit

但这并没有打印任何路径,因为我正试图用if exist逐行检查这些路径是否真的存在,为什么?是因为从文本文件读取时环境变量不起作用吗?如果我删除if exist "%%a",那么它打印得很好,但这会破坏交易。chrome(即使在完全退出后(本身也不会删除这些文件,所以相信我这些列出的文件就在那里这就是我尝试打印这些文件的原因。

我不知所措,有人能帮我做这件事吗?

当文件路径存储在%%a中时,%LOCALAPPDATA%永远不会展开,因为正则变量在for循环变量之前展开(请参阅Windows命令解释器(CMD.EXE(如何解析脚本?了解更多详细信息(。为了将%LOCALAPPDATA%扩展为有意义的内容,我们需要使用call执行另一轮扩展。

@echo off
setlocal enabledelayedexpansion
if exist "%~dp0ChromeJunks.lst" set "Junks=%~dp0ChromeJunks.lst"
for /f "tokens=* delims=," %%a in (%Junks%) do (
call set "filename=%%~a"
if exist "!filename!" echo !filename!
)

问题只是您需要首先扩展变量,最简单的方法是在另一个for循环中运行它,在该循环中,内容将被发送到另一个cmd实例。

如果你的文件内容只是目录,我建议你这样做:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "Junks=%~dp0ChromeJunks.lst"
If Not Exist "%Junks%" Exit /B
For /F UseBackQ^ Tokens^=*^ Delims^=^ EOL^= %%G In ("%Junks%"
) Do For /F Tokens^=*^ Delims^=^ EOL^= %%H In ('Echo("%%~G"'
) Do If Exist "%%~H*" Echo "%%~G"
Pause
EndLocal
Exit /B

或者像这样:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "Junks=%~dp0ChromeJunks.lst"
If Not Exist "%Junks%" Exit /B
For /F UseBackQ^ Tokens^=*^ Delims^=^ EOL^= %%G In ("%Junks%"
) Do For /F Tokens^=*^ Delims^=^ EOL^= %%H In ('Set /P "=%%~G" 0^<NUL ^& Echo('
) Do If Exist "%%~H*" Echo "%%~G"
Pause
EndLocal
Exit /B

或者,对于可能的文件和目录的混合,我会这样做:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "Junks=%~dp0ChromeJunks.lst"
If Not Exist "%Junks%" Exit /B
For /F UseBackQ^ Tokens^=*^ Delims^=^ EOL^= %%G In ("%Junks%"
) Do For /F Tokens^=*^ Delims^=^ EOL^= %%H In ('Echo("%%~G"'
) Do If "%%~aH" GEq "d" (Echo %%G is an existing directory.
) Else If "%%~aH" GEq "-" (Echo %%G is an existing file.
) Else Echo %%G does not exist.
Pause
EndLocal
Exit /B

或者像这样:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "Junks=%~dp0ChromeJunks.lst"
If Not Exist "%Junks%" Exit /B
For /F UseBackQ^ Tokens^=*^ Delims^=^ EOL^= %%G In ("%Junks%"
) Do For /F Tokens^=*^ Delims^=^ EOL^= %%H In ('Set /P "=%%~G" 0^<NUL ^& Echo('
) Do If "%%~aH" GEq "d" (Echo %%G is an existing directory.
) Else If "%%~aH" GEq "-" (Echo %%G is an existing file.
) Else Echo %%G does not exist.
Pause
EndLocal
Exit /B

最新更新