【问题标题】:Creating symlinks with modified path in batch script?在批处理脚本中创建带有修改路径的符号链接?
【发布时间】:2017-03-31 00:52:18
【问题描述】:

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

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

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

【问题讨论】:

  • 我看不懂 Dst 树,缺少 SubDirA + B?
  • SrcDir 应该是所有源目录的父目录。我进行了编辑以使示例更加清晰。
  • 所以你想完全消除第一个子目录级别,但保留子目录?
  • 是的,没错。

标签: batch-file symlink


【解决方案1】:

经过多次尝试和错误,我找到了解决方案:

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!”用于修改目录名称,“exist”用于在创建新文件夹之前检查现有文件夹,“EnableDelayedExpansion”用于使所有字符串操作正常工作。假设您已经设置了 SRC 和 DST 变量。

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多