2016-11-16 2 views
0

この質問の背後にあるアイデアはシンプルですが、バッチスクリプトには新しく、ニュアンスによって私にとって不可能になっています。共通の親ディレクトリを共有するいくつかのソースディレクトリの内容をターゲットディレクトリに複製するための一連のシンボリックリンクを作成する必要があります。例:バッチスクリプトで修正されたパスを持つシンボリックリンクを作成していますか?

DstDir 
    FileA ~ 
    FileB ~ 
    SubDir 
     FileC ~ 

をシンボリックリンクを表示するために〜を使用した:シンボリックリンクを使用して作成する必要があり

SrcDirParent 
    SrcDirA 
     FileA 
    SrcDirB 
     FileB 
     SubDir 
      FileC 

。 SrcDirParentとDstDirは、外部ファイルから絶対パスとして読み込まれます。どのファイル/フォルダがSrcDirParentにあるのか分かりませんし、関連するディレクトリのいくつかは既にDstDirに存在するかもしれませんが、他のものは存在しないかもしれません。それらが存在する場合は、シンボリックリンクを既存のコンテンツとマージする必要があります。

私が現在打っている障壁は、ファイルパスです。私はこのようなループのための2つを使用することを計画:

for /d %%M in (%SRC%\*) do (
    for /r %%F in (%SRC%\%%M\*) do (
     mklink %DST%\%%F %SRC%\%%M\%%F 
    ) 
) 

しかし、これは%% Mと%% Fの相対ファイルパスを必要とし、これらの変数は絶対パスで満たされています。私はそれをどのように修正するか分からない。

私が予想しているもう1つの問題は、SRCとDSTが競合するファイルパスを持っていることです。既存のパスをシンボリックリンクで上書きしたくありません。

これはこれを投稿するのに最適な場所でした。前もって感謝します。

+0

私はDstツリーを理解できません、SubDirA + Bはありませんか? – LotPings

+0

SrcDirはすべてのソースディレクトリの親とされていました。この例をもう少し明確にするように編集しました。 – user258887

+0

したがって、最初のサブディレクトリレベルを完全に削除したいのに、SubSubdirsは保持しますか? – LotPings

答えて

0

多くの試行錯誤の後、私は解決策を見つけた:

setlocal ENABLEDELAYEDEXPANSION 

for /d %%M in (%SRC%\*) do (
    pushd %%M 
    for /r %%F in (*) do (

     set temp1=%%F 
     set temp2=!temp1:%%M=! 
     set temp3=!temp2:%%~nxF=! 

     if not exist "%DST%!temp3!" (
      mkdir "%DST%!temp3!" 
     ) 

     mklink "%DST%!temp2!" %%F 
    ) 
    popd %%M 
) 

それは内部ループ用のディレクトリを変更する「のpushd」と「POPD」を使用して、「!文字列:!見つけ=置き換えます」新しい名前を作成する前に既存のフォルダを確認するために「存在する」、すべての文字列操作を正しく機能させるために「EnableDelayedExpansion」を使用します。 SRC変数とDST変数がすでに設定されていると仮定します。

関連する問題