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 

Кнопка открытия текущего каталога в плагине NTFS4TC
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Jul 26, 2010 18:06    Post subject: Кнопка открытия текущего каталога в плагине NTFS4TC Reply with quote

Есть кнопка:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\TOTALCMD.EXE /S /O
/L=\\\NTFS\"%P"
Icons\ntfs_root.ico
NTFS (Support/Create Images)

1
-1
Нужно вместо %P написать: I0 <Диск>: (<метка>)\<Путь без буквы диска>
Есть ли возможность создать переменные окружения для идентификатора, метки и пути без буквы диска? Сначала было подумал, что идентификатор можно обозначать в соответствии с алфавитным порядком букв дисков, но понятно, что это не подойдёт для приводов и хардов/флешек в Fat(16,32), соответственно, последовательность нарушится. Кто что может подсказать?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Aug 04, 2010 07:18    Post subject: Reply with quote

Поскольку с переменными средами ничего не наклёвывается, приходится искать решение в WSH.
Code:
'Открыть текущий каталог в плагине NTFS4TC
Option Explicit
Dim TCS,fso,i,ID',Metka
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
For each i In fso.Drives
   'If i.DriveType=2 Then
   'Metka=i.VolumeName
   'End If
   'Next


Set TCS = CreateObject("TCScript.Helper")
TCS.SendCommand "cm_EditPath"
TCS.SendKeystroke "{HOME}{SPACE}{RIGHT 2}{SPACE}{(}"
   'TCS.SetTextToClip(Trim(Metka))
   'TCS.SendKeystroke "^{v}"
TCS.SendKeystroke "{)}{HOME}"
TCS.SetTextToClip "\\\NTFS\I"
TCS.SendKeystroke "^{v}"
TCS.SetTextToClip(Trim(ID))    ' Помещает в буфер номер смонтированного диска
TCS.SendKeystroke "^{v}"
TCS.SendKeystroke "{ENTER}"
TCS.ClearClip
Set TCS = Nothing
WScript.Quit
В общем накидал несколько корявый скрипт. Пока закомментированные строки не актуальны: оказалось, что плагин допускает пути без метки.

Требуется помощь скриптеров: вместо ID должен стоять номер смонтированного диска с файловой системой NTFS, присвоенного по счётчику плагином. Ну, предположительный сценарий:
Code:
If i.FileSystem = "NTFS" & i.DriveLetter = "C" Then ID=0
End If
If i.FileSystem = "NTFS" & i.DriveLetter = "D" Then ID=1
End If
...
Не знаю, как проверять, какой диск открыт в файловой панели в таком случае. Просьба помочь с реализацией идеи.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Aug 11, 2010 18:22    Post subject: Reply with quote

Сегодня решил продолжить поиск решения. Написал-таки что-то поразумнее, но не знаю как всю эту петрушку (отделено знаками вопроса) зациклить.
Уважаемая просьба откликнуться и написать тем, кому есть что сказать по сему вопросу!
Volniy, Batya, LocKtaR-o-DarK, Tol'k, Lev, sa, будут любые соображения, пишите; если даже решение не проглядывается, просьба пояснить в чём сложность реализации, и есть ли смысл искать способ.

Code:
Dim TCS,objFSO,fso,i,ID,d0,d1,d2,d3',d4,d5,d6,d7
Set TCS = CreateObject("TCScript.Helper")
Set objFSO = CreateObject("Scripting.FileSystemObject")

TCS.SendCommand "cm_CopySrcPathToClip"
Str = TCS.GetTextFromClip
Set i = objFSO.GetDrive(Left(Str,2)) 'Определяем том диска активной папки

'Объявляем диски поочерёдно
Set d0 = objFSO.GetDrive("C:")
Set d1 = objFSO.GetDrive("D:")
Set d2 = objFSO.GetDrive("E:")
Set d3 = objFSO.GetDrive("F:")
'Set d4 = objFSO.GetDrive("H:")
'Set d5 = objFSO.GetDrive("G:")
'Set d6 = objFSO.GetDrive("H:")
'Set d7 = objFSO.GetDrive("I:")
'Set d8 = objFSO.GetDrive("J:")
'при желании продолжить

If i.FileSystem <> "NTFS" Then MsgBox "Файловая система не поддерживаетя!", TCS.ClearClip, WScript.Quit()

'??????????????Присваеваем номер диску????????????????????????????????????
If i.DriveLetter = "C" Then ID = "0"
If i.DriveLetter = "D" And d0.FileSystem <> "NTFS" Then ID = "0"
If i.DriveLetter = "D" And d0.FileSystem = "NTFS" Then ID = "1"

If i.DriveLetter = "E" And d0.FileSystem <> "NTFS" And d1.FileSystem <> "NTFS" Then ID = "0"
If i.DriveLetter = "E" And d0.FileSystem <> "NTFS" And d1.FileSystem = "NTFS" Then ID = "1"
If i.DriveLetter = "E" And d0.FileSystem = "NTFS" And d1.FileSystem = "NTFS" Then ID = "2"

'На эти строки( без ' ) возникает ругань "Диск не готов". >> В чём причина?
'If i.DriveLetter = "F" And d0.FileSystem <> "NTFS" And d1.FileSystem <> "NTFS" And d2.FileSystem <> "NTFS" Then ID = "0"
'If i.DriveLetter = "F" And d0.FileSystem = "NTFS" And d1.FileSystem <> "NTFS" And d2.FileSystem <> "NTFS" Then ID = "1"
'If i.DriveLetter = "F" And d0.FileSystem <> "NTFS" And d1.FileSystem <> "NTFS" And d2.FileSystem = "NTFS" Then ID = "1"
'If i.DriveLetter = "F" And d0.FileSystem <> "NTFS" And d1.FileSystem = "NTFS" And d2.FileSystem <> "NTFS" Then ID = "1"
'If i.DriveLetter = "F" And d0.FileSystem <> "NTFS" And d1.FileSystem = "NTFS" And d2.FileSystem = "NTFS" Then ID = "2"
'If i.DriveLetter = "F" And d0.FileSystem = "NTFS" And d1.FileSystem <> "NTFS" And d2.FileSystem = "NTFS" Then ID = "2"
'If i.DriveLetter = "F" And d0.FileSystem = "NTFS" And d1.FileSystem = "NTFS" And d2.FileSystem <> "NTFS" Then ID = "2"
'If i.DriveLetter = "F" And d0.FileSystem = "NTFS" And d1.FileSystem = "NTFS" And d2.FileSystem = "NTFS" Then ID = "3"
'Условия для остальных дисков дописывать по желанию)))))
'?????????????????????????????????????????????????????????????????????????????????

path = "\\\NTFS\I" + ID + " " + i + " (" + i.VolumeName + ")" + Right(Str,(Len(Str)-2)) + "\"
TCS.SetTextToClip(path)
TCS.SendCommand "cm_EditPath"
TCS.SendKeystroke "^{v}"
TCS.SendKeystroke "{ENTER}"
TCS.ClearClip
Set TCS = Nothing
Set objFSO = Nothing
WScript.Quit()
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Wed Aug 11, 2010 19:39    Post subject: Reply with quote

М.б. поможет
Буквы дисков с NTFS
Code:
wmic logicaldisk where (FileSystem="NTFS") get Name /value

Метки дисков с NTFS
Code:
wmic logicaldisk where (FileSystem="NTFS") get VolumeName /value
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Aug 11, 2010 20:01    Post subject: Reply with quote

Tol!k
Я немножко не понял, ты предлагаешь на основании wmic написать батник, а потом привернуть его к скрипту? Пытаясь сходу разобраться в смысле предложенных строк, пока не представляю, как оно может мне помочь в создании цикла для присвоения номера(числового значения) диска с конкретной файловой системой. Проясни, пожалуйста.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Wed Aug 11, 2010 20:16    Post subject: Reply with quote

Я не спец по VBS, но мне кажется разобрать и пронумеровать уже отфильтрованный по типу ФС список проще и красивее, чем то, что ты написал между строками '????????????????????????????
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Aug 11, 2010 20:36    Post subject: Reply with quote

Tol!k
То, что у меня между знаками "?" - это вообще жуть, потому что с каждой новой буквой кол-во условий растёт с геометрической прогрессией. Sad Только в том то и дело, что я представления не имею, как создать цикл, в которым будет пронумеровываться полученный список доступных NTFS-дисков.
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Wed Aug 11, 2010 21:58    Post subject: Reply with quote

Quote:
как создать цикл, в которым будет пронумеровываться полученный список

Code:
wmic logicaldisk where (FileSystem="NTFS") get Name /value >ntfs.txt
— это обрабатываемый список

Code:
Dim fso, InFile, Cnt, Str, Strngs, ts, nn, rr
Set fso = CreateObject("Scripting.FileSystemObject")

InFile = "ntfs.txt"
Set ts = fso.OpenTextFile(InFile,1)

Cnt = 0
Strngs = ""
Do Until ts.AtEndOfStream
   Str = ts.ReadLine
   rr = Split(Str, "=")
   nn = UBound(rr)
   Letter = rr(nn)
   If nn >0 Then
      Strngs = Strngs & "Disk(" & CStr(Cnt) & ")  " & Replace(Letter, Chr(0), "")
      Cnt = Cnt+1
   End If
Loop

WScript.Echo(Strngs)

ts.Close
Set ts = Nothing
Set fso = Nothing
WScript.Quit
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2224
Location: Москва, Россия

Post (Separately) Posted: Thu Aug 12, 2010 10:43    Post subject: Reply with quote

Flasher
Примерно так:
Code:
'=====================================================
' Открытие в TC текущей папки в плагине NTFS4TC
'
' Параметры:
' "%P"
'
' Автор - Batya
'=====================================================
Option Explicit
Dim FSO, WSH, D, i, Path, NewPath, FS, TCPath, Drive
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Path    = WScript.Arguments(0)
Drive   = UCase(Left(FSO.GetDriveName(Path), 1))
i = 0
NewPath = ""
For Each D In FSO.Drives
  On Error Resume Next
  FS = D.FileSystem
  If (Err.Number = 0) And (FS = "NTFS") Then
    If UCase(D.DriveLetter) = Drive Then
      NewPath = "\\\NTFS\I" & CStr(i) & " " & D.DriveLetter & ": (" & D.VolumeName & ")" & Mid(Path, 3)
      Exit For
    End If
    i = i + 1
  End If
  On Error GoTo 0
Next
If NewPath = "" Then
  MsgBox "Файловая система не поддерживается!", vbCritical+vbOKOnly, "Ошибка"
Else
  TCPath  = WSH.ExpandEnvironmentStrings("%Commander_Path%") & "\totalcmd.exe"
  'MsgBox """" & TCPath & """ /S /O /L=""" & NewPath & """"
  WSH.Run """" & TCPath & """ /S /O /L=""" & NewPath & """", 1, True
End If

Set D   = Nothing
Set WSH = Nothing
Set FSO = Nothing
WScript.Quit 0

Полностью проверить не могу - плагин не установлен.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Thu Aug 12, 2010 15:36; edited 2 times in total
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Aug 12, 2010 12:19    Post subject: Reply with quote

Tol!k
Спасибо за труд! Вчера посмотрел что получается, всё таки два лишних файла к красоте не отнести Wink , я уже было накидал цикл для списка томов вместо предложенного wmic >>
Code:
Dim FSO,i,x,s,n,drive
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
For each x In FSO.Drives
If x.DriveType<>4 Then
If x.DriveType=1 Or 2 And i<>"A:" And x.FileSystem="NTFS" Then
drive=x.DriveLetter
n=fso.GetDrive(drive)
s = s & n & vbNewLine
End If 
End If
Next
но тут подоспела тяжёлая артиллерия. Wink

Batya
Это самое красивое, что я видел за последние пару недель! Настолько просто и идеально выглядит скрипт, даже Хелпер и буфер не затронулись, круто! Cool

Но пока ругается на 14 строку: Индекс выходит за пределы допустимого диапазона.

Добавлено: Нашёл кое-что странное >>
Batya wrote:
Code:
NewPath = "\\\NTFS\ID".....
Я так понимаю, тут D на конце убрать надо?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2224
Location: Москва, Россия

Post (Separately) Posted: Thu Aug 12, 2010 13:01    Post subject: Reply with quote

Flasher
Поправил.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Aug 12, 2010 13:09    Post subject: Reply with quote

Batya
Flasher wrote:
ругается на 14 строку: Индекс выходит за пределы допустимого диапазона.
Остаётся в силе.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2224
Location: Москва, Россия

Post (Separately) Posted: Thu Aug 12, 2010 13:54    Post subject: Reply with quote

Flasher
А ты %P%N в параметрах вызова скрипта прописал?
Курсор на чём стоит, когда скрипт вызываешь?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Aug 12, 2010 14:21    Post subject: Reply with quote

Batya wrote:
А ты %P%N в параметрах вызова скрипта прописал?
Курсор на чём стоит, когда скрипт вызываешь?
О, слона-то я и не приметил! Файлы открывать плагин не умеет, поэтому выполнять вход будет с ошибкой. Оставил %P. Теперь вход в тома с NTFS осуществляет грамотно, но несколько медленней, чем, как в моём варианте с cm_EditPath. Можно поставить проверку максимум до 24 томов?
Теперь вот какая задача: посмотри я там, где Tol'k'у отвечал, в цикле поставил ограничения на проверку дисководов(FDD, CD/DVD). Если я открываю твоим скриптом на виртуальных дисках, резаках /(сетевых нет, проверить не могу), то либо ТС падает, либо входит в конструкцию ///NTFS/I. Надо где-то ещё условия добавить. И не помешало бы что-то наподобие этой строки:
Code:
If FS <> "NTFS" Then MsgBox "Файловая система не поддерживается!", WScript.Quit()
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2224
Location: Москва, Россия

Post (Separately) Posted: Thu Aug 12, 2010 15:37    Post subject: Reply with quote

Flasher
Поправил.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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