[英]Batch: FOR /R doesn't work with a variable in the path
一個例子:
FOR %%i IN (3) DO (
ECHO %%i
FOR /R "C:\backup\server%%i\temp" %%? IN (*.bak) DO (
REM some code...
)
)
ECHO
結果: 3
。
第二個FOR
結果:代碼未執行。
但與:
FOR %%i IN (3) DO (
ECHO %%i
FOR /R "C:\backup\server3\temp" %%? IN (*.bak) DO (
REM some code...
)
)
ECHO
結果: 3
。
第二個FOR
結果:代碼被執行。
任何的想法?
我找到的唯一解決方案:
FOR %%i IN (3) DO (
PUSHD "C:\backup\server%%i\temp"
FOR /R %%g IN (*.bak) DO (
REM some code...
)
POPD
)
文檔: http : //ss64.com/nt/for_r.html
如果未指定 [drive:]path,它們將默認為當前 drive:path。
編輯:我在 dbenham 回答后添加了PUSHD
/ POPD
。 感謝他。
原始代碼不起作用的原因是因為在解析 FOR 時必須知道 FOR /R 選項的目錄,但在解析 FOR 語句之后才會擴展 %%i 變量。 adarshr 建議存在同樣的問題 - !suffix! 直到解析 FOR 語句后才展開。
GG 的答案是一個非常好的可行的解決方法。 也許可以通過 PUSHD 和最后的 POPD 而不是 CD 來改進。 但只有在需要時。
我能想到的解決問題的唯一其他方法是這樣的
@echo off
FOR %%i IN (3) DO call :innerLoop %%i
exit /b
:innerLoop
FOR /R "C:\backup\server%1\temp" %%? IN (*.bak) DO (
REM some code...
)
exit /b
但我不喜歡使用 CALL,除非我必須這樣做,因為它效率低下。 我喜歡 CD 解決方案。
For /f 總是比 FOR /R 更靈活,如下所示:
FOR %%i IN (3) DO (
FOR /f "delims=" %%? IN ('DIR /s/b "C:\server%%i\*.bak"') DO (
ECHO %%?
)
)
輸出:
C:\\server3\\1.bak
C:\\server3\\subfolder\\2.bak
此外,要遞歸搜索多個文件類型:
FOR %%i IN (3) DO (
FOR /f "delims=" %%? IN ('DIR /s/b "C:\server%%i\*.bak","C:\server%%i\*.htm"') DO (
ECHO %%?
)
)
輸出:
C:\\server3\\1.bak
C:\\server3\\subfolder\\2.bak
C:\\server3\\subfolder\\1.htm
你不應該設置EnableDelayedExpansion
嗎?
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%i IN (3) DO (
SET suffix=%%i
ECHO !suffix!
FOR /R "C:\backup\server!suffix!\temp" %%? IN (*.bak) DO (
REM some code...
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.