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