2013-12-20 54 views
0

我想循環兩個目錄A和B以及具有相同名稱的文件。一旦我得到了兩個相同的名稱文件的路徑,我想做一些操作。這裏是我的批處理腳本:使用批處理腳本在兩個目錄中循環使用

setlocal ENABLEDELAYEDEXPANSION 
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (  
      set x = %%~nxo 
      set y = %%~nxl 
      if %x% == %y% (echo %x%) 
    ) 
) 
endlocal 

在這裏我試圖打印文件的名稱,但無法這樣做。 我收到一個錯誤:回聲在這個時候是意外的。 那麼這個腳本有什麼問題。

+0

對不起。如果您知道這兩個目錄中存在這些文件,爲什麼只是簡單列出任何目錄是不夠的?有可能有一些文件不存在於一個(只有一個)目錄中?還是在兩者?這個細節可能會導致更快的解決方案... – Aacini

回答

1

問題是空格。試試這個代碼

set x=something_1 
set x = something_2 

echo %x% 
echo %x % 

正如你所看到的,放置空間後的變量的名稱改變的變量的名稱。您正在將值分配給名稱中帶有空格的變量,但嘗試從名稱中沒有空格的變量中檢索值。

一旦空格解決,下一個問題:延遲擴展。

當執行reachs的代碼塊(在這種情況下,你的兩個for命令,包圍在括號中的內容)之前被執行的代碼和,內容分析,並在變量進行熵,所有的地方變量引用被替換爲變量的值。

它們具有的值之前開始執行該塊。

然後該塊執行所需的時間(如for命令中所述)沒有新的替換,與現在一樣,代碼中沒有對變量的讀取。

更改變量的值(當執行相應的set命令時),但這些更改沒有反映在執行的代碼中。它不包含變量,它們被替換爲它們的值。

例外的行爲是變量/的for命令(在代碼中%%o%%l),其意在改變它的值和的替換參數,延遲時擴充被啓用(setlocal enabledelayedexpansion)變量作爲!var!代替參考通常%var%

考慮到這一點,你的代碼執行,因爲它是沒有讀取變量的值寫爲

setlocal ENABLEDELAYEDEXPANSION 
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (  
      set x=%%~nxo 
      set y=%%~nxl 
      if == (echo) 
    ) 
) 
endlocal 

。所有已更改與它們的初始值(在此示例中,假設emtpy值)

如何解決:兩個選擇

1 - 無延遲擴展:使用的變量的命令

for /r "A" %%o in (*.c,*.cpp,*.h) do for /r "B" %%l in (*.c,*.cpp,*.h) do (  
    if "%%~nxo"=="%%~nxl" (echo "%%~nxo") 
) 

2 - 延遲擴展啓用

for /r "A" %%o in (*.c,*.cpp,*.h) do for /r "B" %%l in (*.c,*.cpp,*.h) do (
    set "x=%%~nxo" 
    set "y=%%~nxl" 
    if "!x!"=="!y!" (echo "!x!") 
) 
+0

刪除第4行和第5行的空格。但仍然存在問題。 –

+0

@PiyushGoyal:請參閱更新的答案。你糾正了一個問題,再解決一個問題。 –

0

看看這個爲您提供:

@echo off 
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (  
    if "%%~nxo"=="%%~nxl" echo."%%~nxo" 
    ) 
)