在批处理脚本中创建带有修改路径的符号链接?

时间:2016-11-16 17:36:07

标签: batch-file symlink

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

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存在冲突的文件路径时 - 我不想用符号链接覆盖现有路径。

希望这是发布此内容的正确位置。提前谢谢。

1 个答案:

答案 0 :(得分: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”来更改内部循环的目录,“!string:find = replace!”用于修改目录名称,“存在”以在创建新文件夹之前检查现有文件夹,并使用“EnableDelayedExpansion”使所有字符串操作正常工作。假设您已经设置了SRC和DST变量。