2016-03-30 3 views
1

スクリプトの作業に迷惑をかけずにかなり長い間検索しました。私はかなり近くにいるように感じますが、少し助けが必要です。再帰的に "srcdir"(スクリプトの冒頭で設定)を再帰的にスキャンするFORループを使用しようとしていますが、ループがファイル/パス(%% f)を返すと、ファイルパスの一部を別のもの(例:C:\ rootpath \ desのC:\ rootpath \ src)。forループと変数置換を使用してファイルパスを一括して分割する

は、私はこの1つのようなスクリプトを使って、ちょうどこのような何かを行うことができる午前:これは困難に何が

set subdir=C:\rootpath\src 
set subdir=%subdir:src=des% 
echo %subdir% 

、私の「SRCDIR」のルートパスが変更される可能性がある(例えば、C :\ roothpath)と "srcdir"が変更された後にすべての再帰的に(例えば、C:\ rootpath \ srcのフォルダ "src"の後のもの)。フォルダsrcとフォルダdes(私がバッチファイルを実行しているのと同じディレクトリにあります)の唯一の定数パスです。

したがって、前の例と同じ手法を使用して、 "srcdir"(%% f)のファイルのフルパスを再帰的に検索し、 "src"フォルダをパス文字列のフォルダ "des"。したがって、変数(subdir)として "%% f"を設定し、変数置換を使用してフォルダを置き換えようとしています。ここで

が私の現在の非稼働スクリプトです:

set srcdir=C:\rootpath\src 
for /r "%srcdir%" %%f in (*.txt) do (
set subdir=%%f 
set subdir=%subdir:src=des% 
echo %subdir% 
) 

任意の助けいただければ幸いです!ありがとう!

+0

'for'ループのようなコードブロック内の変数を設定して読み込むとすぐに[delayed expansion](http://ss64.com/nt/delayedexpansion.html)が必要になります... – aschipfl

+0

だから私forループが開始する前に 'Setlocal EnableDelayedExpansion'を使用する必要がありますか? –

+0

はい、これにより有効になります。それを実際に使用するには、 '%variable% 'ではなく'!variable! 'のような変数を展開する必要があります。これはサブ文字列の置換構文にも当てはまります... – aschipfl

答えて

2

あなたはforループのようなコードのブロック内の変数を割り当てて、読んでいるので、あなたはdelayed expansionを有効にする必要があります

setlocal EnableDelayedExpansion 
set "srcdir=C:\rootpath\src" 
for /R "%srcdir%" %%F in ("*.txt") do (
    set "subdir=%%~fF" 
    set "subdir=!subdir:\src\=\des\!" 
    echo(!subdir! 
) 
endlocal 

setlocal EnableDelayedExpansionコマンドが遅延拡張を可能にします。環境をローカライズします。つまり、環境変数の変更は、endlocalが実行されるか、バッチファイルが終了する前にのみ利用可能です。

遅延拡張を実際に使用するには、パーセント記号を感嘆符で置き換える必要があります。したがって、%subdir%!subdir!になります。

+0

ありがとうございます。それははるかに理にかなっています。スクリプトを作成して遅延拡張をよりよく理解できるようになりました。 :) –

関連する問題