Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Работа в папках с превышением длины пути 
Author Message
Monarch-LFV



PostPosted: Sun Nov 03, 2024 15:48    Post subject: Reply with quote

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 для него, к сожалению, не нашел в справке (правилах) на форуме. Подскажите плиз как оформляется и опишите в правилах, если этого там нет.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group