Я написал VBscript, который проверяет длину пути и вызывает subst
, как только достигается определенный порог. Эти вызовы накладываются друг на друга, так что в середине рекурсии существует такой макет:
C:\a\very\long\path
subst K: "C:\a\very\long\path"
K:\another\very\long\path
subst L: "K:\another\very\long\path"
L:\yet\another\very\long\path
subst M: "L:\yet\another\very\long\path"
xcopy M:\*.* "D:\target"
Таким образом, с каждым уровнем субстрата генерируется более короткий путь. Это также означает, что вы должны копировать свои папки последовательно, чтобы иметь возможность проверять длинные пути перед тем, как выполнить команду копирования.
Как только все файлы в папке скопированы, рекурсия возвращается на один уровень назад (subst /d
), освобождая одну букву диска.
Используя 4-5 букв дисков, которые заменяют друг друга, когда путь становится глубоким, я смог скопировать пути, длина которых превышала предел MAX_PATH.
EDIT
Здесь описана общая процедура выполнения с помощью subst. То, как вы это делаете, зависит от ваших потребностей, я всегда использовал этот маленький подвох в минимуме, «решая эту единственную проблему».
Например, копирование по столь же глубокому целевому пути означает, что вам нужен еще один стек замененных букв дисков.
Распаковка всех файлов .zip в пределах одной глубоко вложенной структуры каталогов может потребоваться только в стеке, но вам нужно немного сократить порог для учета папок в .zip и т. Д.