2016-11-16 2 views
0

Идея этого вопроса проста, но я новичок в пакетных сценариях, поэтому нюансы делают это невозможным для меня. Мне нужно создать набор символических ссылок для репликации содержимого нескольких исходных каталогов, которые совместно используют общий родительский каталог, в целевой каталог. Пример:Создание символических ссылок с измененным путем в пакетном скрипте?

SrcDirParent 
    SrcDirA 
     FileA 
    SrcDirB 
     FileB 
     SubDir 
      FileC 

Какие используя символические ссылки должны создать:

DstDir 
    FileA ~ 
    FileB ~ 
    SubDir 
     FileC ~ 

Использование ~ показать символическую ссылку. SrcDirParent и DstDir считаются абсолютными путями из внешнего файла. Я не знаю, какие файлы/папки будут в SrcDirParent, и некоторые из соответствующих каталогов могут уже существовать в DstDir, а другие нет. Если они существуют, мне нужно объединить символические ссылки с существующим контентом.

Барьер, который я сейчас нажимаю, связан с файловыми файлами. Я планировал использовать два для петель, как это:

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

Итак, вы хотите полностью исключить первый уровень субдира, но сохранить 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.

Смежные вопросы