2017-07-18 105 views
1

我的要求是編寫批處理腳本來查找並替換給定目錄集中所有*-spec.js文件中的字符串。因此我寫了批處理文件並運行批處理腳本如下。批處理腳本 - 循環中的動態/可變路徑

<script file name> <search_string> <replace_string> <folder_path_1> <folder_path_2> <folder_path_n> 

(我相信folder_path_n不會超出7)

e.g C:\CI\Scripts>replace.bat hello world C:\app\e2e C:\sppa\e2e 所以我的腳本如下。

@echo off 
setlocal enabledelayedexpansion 

set argCount=0 
for %%x in (%*) do (
    set /A argCount+=1 
    set "argVec[!argCount!]=%%~x" 
) 

set search=%1 
set replace=%2 

echo Search is %search% 
echo Replace is %replace% 

for /L %%i in (3,1,%argCount%) do (
    set path=!argVec[%%i]! 
    echo path is !path! 

    for /R !path! %%F in (*spec.js) do (
     echo %%F 
    ) 
) 

這打印4個參數作爲預期甚至正確的路徑也被打印。在接下來的步驟中,我們期望循環遍歷給定的路徑並獲取所有以「spec.js」結尾的文件。

e.g不工作:

for /R !path! %%F in (*spec.js) do (
    echo %%F 
) 

但不打印輸出。相反,如果該變量被替換爲硬編碼值,則其按預期工作。

e.g - 工作:

for /R C:\app\sppa\e2e %%F in (*spec.js) do (
    echo %%F 
) 

你的幫助是非常感謝!

回答

1

我也試過類似的@Andre Kampling如下建議。

cd !path! 
::echo Changed the path to !path! 
FOR /R %%F IN (*spec.js) DO (
echo %%F 
) 
+1

是的,但是'pushd'節省的來源和使用'popd'你可以回去了。 –

+0

同意。在我的情況下,因爲我保持每個目錄的絕對路徑,所以不會產生任何問題:) –

2

它不起作用的原因是,當解析循環時必須知道變量內容,這意味着它只適用於可以擴展而沒有延遲擴展的變量。儘管如此,還是有一個簡單的解決方案,因爲for /r迴路正在使用當前路徑(from ss64)。

如果未指定[drive:]路徑,它們將默認爲當前drive:路徑。

只需更改目錄!path!然後回去:

rem Change into !path! and remember directory coming from 
pushd !path! 
for /R %%F in (*spec.js) do (
    echo %%F 
) 
rem Change back to origin 
popd