如問題標題中所述,如果傳遞給腳本的引數是 Chrome,我有一個 Batch/CMD(OS: Windows 10 64Bit) 腳本來遍歷其中的子檔案夾%LocalAppData%
,并遞回查找并列出在任何位置包含單詞Cache的所有檔案夾。
我想出的依賴for /d /r
回圈的腳本是這樣的:
@echo off && setlocal EnableDelayedExpansion
if /i "%1" equ "chrome" (
set "subPath0=\Google"
set "subPath1=\User Data"
for /d /r "%LocalAppData%!subPath0!\%1" %%i in (*Cache*) do (
echo "%%i"
)
) else (
for /d /r "%Appdata%\%1" %%i in (*Cache*) do (
echo "%%i"
)
)
但是無論我是否for
喜歡(*Cache*^)
或不轉義回圈內的右括號,上述回圈都沒有遞回列出任何*Cache*
目錄,即使檔案夾內的路徑(運行回圈的路徑)內實際上有快取檔案夾。for
User Data
那么誰能指出我在這里做錯了什么并幫助解決這個問題?
注意:我知道 Powershell 是 Batch/CMD 的不錯選擇,但這應該是較大腳本的一部分,因此如果在 Batch/CMD 中提出建議/修復,將不勝感激。
uj5u.com熱心網友回復:
從FOR
命令中洗掉路徑并改用 PUSHD。
@echo on
setlocal EnableDelayedExpansion
if /i "%1" equ "chrome" (
set "subPath0=\Google"
set "subPath1=\User Data"
pushd "%LocalAppData%!subPath0!\%~1"
for /D /R %%i in (*Cache*) do (
echo "%%i"
)
popd
) else (
pushd "%Appdata%\%1"
for /d /r %%i in (*Cache*) do (
echo "%%i"
)
popd
)
為什么不將其簡化為一個FOR
命令?
@echo on
setlocal EnableDelayedExpansion
if /i "%~1" equ "chrome" (
set "subPath0=\Google"
set "subPath1=\User Data"
set "searchpath=%LocalAppData%!subPath0!\%1"
) else (
set "searchpath=%Appdata%\%~1"
)
for /d /r "%searchpath%" %%i in (*Cache*) do echo "%%i"
uj5u.com熱心網友回復:
我強烈建議使用:
@echo off & setlocal EnableExtensions DisableDelayedExpansion
if /I not "%~1" == "chrome" goto SearchAppdata
for /D /R "%LocalAppData%\Google\%~1" %%i in (*Cache*) do echo "%%i"
goto EndBatch
:SearchAppdata
for /D /R "%Appdata%\%~1" %%i in (*Cache*) do echo "%%i"
:EndBatch
endlocal
所有變化的解釋:
該命令
echo off
永遠不會失敗,因此在第一行&
使用無條件運算子而不是條件運算子。&&
有關詳細資訊,請參閱使用 Windows 批處理檔案的多行命令。批處理檔案需要啟用命令擴展。出于這個原因,建議顯式啟用命令擴展并且不要依賴于在批處理檔案之外啟用。
明確不使用延遲擴展,因為這將導致
%~1
,或擴展為具有一個或多個的字串將不再正確處理,并將感嘆號解釋為文字字符。%%i
%LocalAppdata%
%Appdata%
!
字串比較運算子
==
用于比較兩個字串,而不是整數比較運算子equ
也適用于字串,但在一些罕見的用例中與字串比較運算子不同。有關詳細資訊,請參閱Windows 批處理檔案中與 NEQ、LSS、GTR 等等效的符號。傳遞給批處理檔案的第一個引數字串
"
在開頭和結尾都被洗掉,如果兩邊都包含在其中"
,否則批處理檔案處理由于嚴重的語法錯誤已經在第二行停止。如果有人使用類似的東西運行批處理檔案,仍然會發生這種情況google"
,即引數字串的末尾有雙引號,但開頭沒有雙引號。也可以使用額外的命令列來處理這種極其罕見的用例,但這里不應該真的有必要,因為這是程式或用戶啟動批處理檔案的語法錯誤。命令GOTO用于避免命令塊,這使得可以參考所有環境變數而不會延遲擴展。
命令FOR不支持在 之后指定的路徑內延遲擴展/R
。這是 DosTips 論壇主題Limitation in for /r command 中記錄的此命令的一個已知問題。解決方案是避免在/R
.
可以在CD之前使用(不適用于 UNC 路徑)或PUSHD(也適用于啟用了命令擴展的 UNC 路徑)和回圈之后的POPD 。或者使用由另一個在后臺啟動的命令列程執行的命令DIRcache
,它的優點是還可以找到包含名稱中字串的隱藏目錄,該字串在遍歷隱藏目錄時也會for /D
忽略。for /R
@echo off & setlocal EnableExtensions DisableDelayedExpansion
if /I not "%~1" == "chrome" goto SearchAppdata
for /F "delims=" %%i in ('dir "%LocalAppData%\Google\%~1\*Cache*" /AD-L /B /S 2^>nul') do echo "%%i"
goto EndBatch
:SearchAppdata
for /F "delims=" %%i in ('dir "%Appdata%\%~1\*Cache*" /AD-L /B /S 2^>nul') do echo "%%i"
:EndBatch
endlocal
/AD-L
在這種情況下,由于選項(屬性目錄,但不是屬性鏈接),重決議點(目錄連接、符號鏈接)被顯式忽略,有關 Windows 上的鏈接的更多資訊,請參見SS64 - MKLINK 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428994.html
上一篇:在批處理檔案中生成程式命令
下一篇:以更有吸引力的方式列印出字典鍵