正如我在 Q-title 中提到的,我正在嘗試從包含這些路徑的串列檔案中讀取一些我打算稍后洗掉的檔案路徑,這些路徑由newline以下 [ChromeJunks.lst] 分隔:
%LOCALAPPDATA%\Google\Chrome\User Data\Default\History
%LOCALAPPDATA%\Google\Chrome\User Data\Default\History-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Network Action Predictor
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Network Action Predictor-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Top Sites
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Top Sites-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Visited Links
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Favicons
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Favicons-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Web Data
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Web Data-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Log
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Log.old
%LOCALAPPDATA%\Google\Chrome\User Data\Default\QuotaManager-journal
%LOCALAPPDATA%\Google\Chrome\User Data\Default\QuotaManager
%LOCALAPPDATA%\Google\Chrome\User Data\Default\LOCK
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Bookmarks.bak
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Affiliation 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,為什么?是因為從文本檔案讀取時 Env 變數不起作用嗎?如果我洗掉if exist "%%a",那么它列印得很好,但這是一個交易破壞者。并且chrome(即使在完全退出后)本身也不會洗掉這些檔案,所以相信我這些列出的檔案就在那里,這就是我試圖列印這些檔案的原因。
我很茫然,任何人都可以幫助完成這項作業嗎?
uj5u.com熱心網友回復:
當檔案路徑存盤在%%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!
)
uj5u.com熱心網友回復:
問題很簡單,您需要先擴展變數,最簡單的方法是在另一個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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/442153.html
標籤:列表 批处理文件 命令 windows-10 回声
下一篇:.bat檔案的條件執行
