2016-11-16 112 views
0

这个问题背后的想法很简单,但我是批处理脚本的新手,所以细微差别让我无法做到。我需要创建一组符号链接来将几个共享公共父目录的源目录的内容复制到目标目录中。例如:在批处理脚本中使用修改的路径创建符号链接?

SrcDirParent 
    SrcDirA 
     FileA 
    SrcDirB 
     FileB 
     SubDir 
      FileC 

使用哪种符号链接应该创建:

DstDir 
    FileA ~ 
    FileB ~ 
    SubDir 
     FileC ~ 

用〜展现一个符号链接。 SrcDirParent和DstDir从外部文件读取为绝对路径。我不知道SrcDirParent中的文件/文件夹是什么,一些相关的目录可能已经存在于DstDir中,而另一些则不存在。如果它们确实存在,我需要将符号链接与现有内容合并。

我目前碰到的障碍是文件路径。我计划用两个for循环是这样的:

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

但是这需要%% M和%% F和这些变量相对文件路径都充满绝对路径。我不知道如何解决这个问题。

我期待的另一个问题是当SRC和DST存在冲突的文件路径时 - 我不想用符号链接覆盖现有路径。

希望这是您发布此出行资讯的最佳平台。提前致谢。

+0

我不明白Dst树,SubDirA + B失踪? – LotPings

+0

SrcDir应该是所有源目录的父级。我编辑过的例子使得这个例子更加清晰。 – user258887

+0

所以你想完全消除第一个subdir级别,但保留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变量。

相关问题