簡體   English   中英

批處理:FOR /R 不適用於路徑中的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM