View previous topic :: View next topic |
Author |
Message |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Sat Oct 26, 2024 10:13 Post subject: Работа в папках с превышением длины пути |
|
|
На работе все в основном используем сетевое хранилище (\\NAS\), и огромную структуру папок. Большинство пользователей не заморачиваются с наименованием папок и файлов и от этого образуются неадекватно длинные пути с длинными названиями папок и файлов.
Известно, что при превышении длины пути >259 символов имеются проблемы с запуском файлов. Знаю, что есть в реестре ключик, отключающий это ограничение, но, во-первых, от расположен в кусте HKLM, поэтому его нельзя сменить без прав администратора. А во-вторых, даже если разрешить длинные пути, то все равно большинство программ не смогут запустить с такого пути файлы даже с "\\?\" ("\\?\UNC\") и не работают практически все плагины WLX, кроме, пожалуй, Ulister.
Я нашел обходной путь - создать виртуальный диск ( A:\ ) командой Subst, укорачивающий реальный путь практически до корня. В таких виртуальных дисках все файлы открываются и сохраняются вообще без проблем, быстрый просмотр также великолепно себя ведет. И удобство соответственно еще в том, что фактически все сохраняемые файлы и являются файлами по длинному пути. Для таких случаев написал скрипт на VBS и навешал на кнопку в панели (кому интересно, могу опубликовать или скинуть в личку).
Также сделал расцветку файлов и папок по правилу с плагином Filex (длина пути)>259. То есть, если я захожу в папку и вижу "коричневые" файлы, значит для себя понимаю, что скорее всего они не запустятся из-за этого превышения. В таком случае применяю сделанную мной кнопку.
Но есть определенные неудобства, приходится включать/выключать данный "режим", находясь в такой папке и выходя из нее.
Отсюда вопрос: как можно автоматизировать данный процесс, чтобы при заходе в такую папку, она локализовалась в диск (свободную букву диска), а при выходе - все вернулось на круги своя?
Применение стилей позволяют запускать скрипты, но в Автовыборе стилей нет критерия по длине пути.
Да и вообще, если кто сталкивался с такой проблемой, как ее решали (кроме простого копирования в более короткий путь)? |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Sun Nov 03, 2024 12:16 Post subject: |
|
|
Monarch-LFV
Если каталогов, которые вам действительно нужны и с которыми вы работаете, не так много, то можно попробовать создать на них симлинки в отдельном локальном каталоге. А из алгоритмов... ну разве что цикл запустить, в котором каждые 200-300 млс проверять текущий путь в панели и его длину, и если он (этот путь) превышает необходимый, то запускать скрипт с монтированием диска А:\ в соседней панели. Но, по-моему, это будет перебор Наверное, надо что-то другое думать. Может даже, на зарубежный форум стоит написать... |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Sun Nov 03, 2024 15:48 Post subject: |
|
|
Orion9
Нет, каталоги постоянно разные, это сетевой диск, а соответственно, такие папки могут быть в разных местах. На сайт Гислера написал, но там нет заинтересованных, кто мог бы поддержать, видимо немногие с таким сталкиваются. Свой скрипт усовершенствовал, в принципе делает свое дело, мне этого достаточно. Выкладываю скрипт VBS, вдруг кому пригодится:
Code: | ' Создать виртуальный диск [A]:\ с текущей директорией для обхода ошибки при превышении длины пути
' Буква диска присваивается авоматически (ближайшая свободная)
' Если диск (например, "A:\") уже создан командой Subst и является текущим в панели ТС, то диск будет размонтирован
' Если диск (например, "A:\") уже создан командой Subst, но НЕ является текущим в панели ТС, то создастся новая буква диска на текущую папку
' параметры: %P%N
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
TCP = WshShell.ExpandEnvironmentStrings("%commander_exe%")
TMPfl = WshShell.ExpandEnvironmentStrings("%temp%") & "\~$LongPathTC.txt"
TMPflAVD = WshShell.ExpandEnvironmentStrings("%temp%") & "\~$LongPathTC_AllVirtDisk.txt"
fullpath = WScript.Arguments(0)
fld = Left(fullpath, InStrRev(fullpath, "\")-1)
fldbegin = fld
cursorFile = FSO.GetFilename(fullpath)
WshShell.run "cmd /c subst>" & TMPflAVD , 0, True
Set TMPAVD = FSO.OpenTextFile(TMPflAVD, 1, True, 0): AllVirtDisk = TMPAVD.ReadAll: TMPAVD.Close
AllDisks= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i=1 to len(AllDisks)
DiskLetter=mid(AllDisks, i, 1)
if instr(AllVirtDisk, DiskLetter & ":\:") then VirtDisk = VirtDisk & DiskLetter
if not FSO.FolderExists(DiskLetter & ":\") and disk ="" then Disk = DiskLetter
Next
FSO.deletefile(TMPflAVD)
If instr(VirtDisk, Ucase(left(fld, 1))) then
Disk = Ucase(left(fld, 1))
Set TMPsv = FSO.OpenTextFile(TMPfl & Disk, 1, True, -1): fldOld = TMPsv.ReadAll: TMPsv.Close
CurPath = replace (fld, Disk & ":", "")
if Ucase(left(fld, 2)) = Disk & ":" then WshShell.run """" & TCP & """ /O /S /A """ & fldOld & CurPath & "\" & cursorFile & """", 1, true
WshShell.run "cmd /c subst " & Disk & ": /d", 0 , true
FSO.deletefile(TMPfl & Disk)
else
for i=1 to 100
WshShell.run "cmd /c chcp 65001&&subst " & ucase(Disk) & ": " & """" & fld & """", 0 , true
if FSO.FolderExists(Disk & ":\") then
WshShell.run """" & TCP & """ /O /S /A """ & Disk & ":\" & fldpth & "\" & cursorFile & """"
Set TMPsv = FSO.OpenTextFile(TMPfl & Disk, 2, True, -1): TMPsv.Write(fld & "\"): TMPsv.Close
exit for
else
fld=left(fld, InStrRev(fld, "\")-1)
fldpth=mid(fldbegin, len(fld)+2, len(fldbegin))
end if
next
End if |
PS. Модератору: С удовольствием оформил бы в спойлер, да вот беда, забыл какой BBCode для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Sun Nov 03, 2024 18:34 Post subject: |
|
|
Monarch-LFV
Скрипт уже получился приличный, но, как я понял, он не решает главной задачи, о которой вы говорили в первом сообщении - автоматизировать весь этот процесс.
Странно, что никто не отозвался на зарубежном форуме. Неужели сам Маэстро или кто-то из долгожителей не сталкивался с этой проблемой? Я не сталкивался, но у меня скромные задачи
А если ваш скрипт завязать как-то на WinScript Advanced, не думали? |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Sun Nov 03, 2024 18:43 Post subject: |
|
|
Orion9
Честно говоря, на сайте Гислера я выдвигал немного другие решения проблемы, но суть самой проблемы та же. К сожалению, это оказалось там вообще никому не интересно. А по поводу WinScriptADV - не пойму, как это может помочь? Как и написал в первом посте, сделал только расцветку файлов с помощью плагина Filex. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Sun Nov 03, 2024 18:50 Post subject: |
|
|
Quote: | А по поводу WinScriptADV - не пойму, как это может помочь? |
Если я правильно помню, он позволяет делать свои поля, т.е. запускать для каждого файла в каталоге скрипт при его считывании. Соответственно, можно в скрипте делать проверку на длину пути и файла, и если она больше, чем нужно, запускать ваш скрипт с монтированием этой папки в виртуальный диск. |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Sun Nov 03, 2024 19:03 Post subject: |
|
|
Orion9
Да, но для этого потребуется выводить соответствующие поля, чтобы активизировать сам плагин и скрипт. То есть по сути по умолчанию держать пользовательский набор колонок с колонкой winscriptADV, что не очень хочется. Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox. Думаю, и запуск более сложного скрипта с командой subst и прочими условиями тоже может оказаться невозможным. Но это надо тестировать. В любом случае, пока куда проще иметь расцветку и в случае необходимости просто вызывать скрипт. Тут помог бы автобыбор стилей, но там нет такого критерия. Ну и конечно для этого логику скрипта придется переделать полностью. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Sun Nov 03, 2024 19:25 Post subject: |
|
|
Monarch-LFV
Вот здесь я, помню, эксперементировал с плагином Script
https://forum.wincmd.ru/viewpost.php?p=136837
Думаю, он больше может подойти для задачи, т.к. я слышал, что он более скоростной, чем WinScriptADV.
Ведь необязательно заполнять поле content чем-то реальным, зато можно использовать тот факт, что каждый файл возвращается в переменную filename, которую можно обработать, вычислить путь, длину и запустить монтирование. Как поведет себя ТС при своем перезапуске - не известно. Надо тестировать Но зато можно будет сделать отдельный набор колонок, который и будет запускать скрипт по требованию, т.е. как вы сами знаете, что идете на NAS.
Last edited by Orion9 on Sun Nov 03, 2024 19:29; edited 1 time in total |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Sun Nov 03, 2024 19:29 Post subject: |
|
|
Orion9
Спасибо за идею, буду еще думать как усовершенствовать. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Mon Nov 04, 2024 12:10 Post subject: |
|
|
Quote: | Плюс имеются ограничения плагина при работе с VBS, например нельзя вывести msgbox |
В плагине Script вроде все работает. Сейчас вставил в свой пример MsgBox filename - останавливается как надо строка за строкой при заполнении панели. Вероятно, можно из этого выжать и большее, т.е. диалоговое окно "Да-Нет" с запросом на монтирование, только надо подумать, как реагировать на "Нет" и где хранить глобальные данные. Но учитывая то, что обработка данных идет постраничная, а не весь каталог сразу, то, возможно, придется искать другие решения и способы. В конце концов, может и правда проще хоткей повесить и менять режим просмотра вручную, когда оно требуется. |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Mon Nov 04, 2024 12:54 Post subject: |
|
|
Orion9 wrote: | проще хоткей повесить и менять режим просмотра вручную, когда оно требуется. |
Я тоже уже к этому пришел, меньше заморочек. |
|
Back to top |
|
 |
CaptainFlint

Joined: 14 Dec 2004 Posts: 6190 Location: Москва
|
(Separately) Posted: Wed Nov 06, 2024 00:38 Post subject: |
|
|
Monarch-LFV wrote: | PS. Модератору: С удовольствием оформил бы в спойлер, да вот беда, забыл какой BBCode для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет. |
Да, информацию о тегах так и не дошли руки добавить.
Code: | [cut]тут спойлер[/cut]
[cut="Заголовок"]тут спойлер с собственным заголовком[/cut]
|
_________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
 |
Monarch-LFV

Joined: 22 Jul 2019 Posts: 323
|
(Separately) Posted: Wed Nov 06, 2024 01:00 Post subject: |
|
|
CaptainFlint
Точно, спасибо! Если не сложно, добавьте в справку пожалуйста. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Wed Nov 06, 2024 11:25 Post subject: |
|
|
CaptainFlint
А какие еще есть неочевидные тэги? Я тут недавно заметил, что работает тэг [s], но в справке о нем тоже нет упоминаний. Есть ли еще что-то, о чем следует знать?
Сорри за оффтоп, но хотелось бы весь список, пожалуйста  |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|