2017-07-18 17 views
1

私の要件は、指定された一連のディレクトリにある*-spec.jsすべてのファイルの文字列を検索して置き換えるバッチスクリプトを作成することです。したがって、以下のようにバッチファイルを作成し、バッチスクリプトを実行しました。バッチスクリプト - ループ内の動的変数パス

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

(私はfolder_path_nが7を超えていないと確信しています)

例えば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"で終わるすべてのファイルを取得します。

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

をしかし、それは何も出力しません:

例えば働いていません。代わりに、変数がハードコードされた値に置き換えられた場合、期待どおりに機能します。

例えば - 作業:

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

なぜ動作しないのかという理由は、ループが解析されたときに変数の内容を知っていなければならないということです。遅延展開なしで展開できる変数でのみ機能します。それでも、ループが現在のパス(from ss64)で動作しているので、簡単な解決策があります。for /r

[ドライブ:]パスが指定されていない場合は、現在のドライブ:パスがデフォルトになります。

だけ!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 
関連する問題