Как войти в папку из скрипта в Тотал Коммандер?
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: Как войти в папку из скрипта в Тотал Коммандер? Author: keramer82 PostPosted: Wed Aug 30, 2023 13:17
    —
Доброго времени суток! Пишу небольшой скрипт для Тотал Коммандера. Скрипт должен просто создавать определенную папку в текущем каталоге и входить в нее. Вроде все сделал, но открытие создаваемой папки происходит в проводнике, а нужно остаться в Тотал Коммандере. Подскажите, пожалуйста, как это сделать (создать папку и сразу войти в нее)? Вот что у меня есть на данный момент:
Code:

function setParams(){
  FSO = new ActiveXObject("Scripting.FileSystemObject");
 }
 
 function newFolder(){
  var newFolderName, newFolderName_n, counter, folderCreated;
  newFolderName = "TEST";
  newFolderName_n = "TEST";
  counter = 0;
  folderCreated = false;
  while (! folderCreated){
    if (FSO.FolderExists(newFolderName)) {
     counter++
     newFolderName = newFolderName_n+"("+counter+")";
    }
    else {
     FSO.CreateFolder(newFolderName);
     folderCreated = true;
     var test = new ActiveXObject("WScript.shell");
     test.run(newFolderName, 1, false); // открывает в проводнике
    }
  }
 }

 setParams();
 newFolder();

#2:  Author: Monarch-LFV PostPosted: Wed Aug 30, 2023 14:14
    —
keramer82
Делюсь своим скриптом VBS для расширенного создания папок, делал сугубо для своих нужд. Можете или пользоваться им, или просто подсмотреть решение:
Code:
' Расширенное создание папок
' Параметры "%P" (в кавычках)

' ============================
' Изменяемые в VBS параметры:
  DelTire = 1 ' удаление " - " (пробел тире пробел) в конце имен папок, 0 - нет, 1 - да
' ============================

On Error Resume Next
set FSO = createobject ("Scripting.FileSystemObject")
DateNow = Year(Date) & "." & Right(0 & Month(Date), 2) & "." & Right(0 & Day(Date), 2) & " - "
Fld = Inputbox("Введите имя папки" & vbnewline & vbnewline & "   * (звездочка) - создание папок по списку из буфера обмена" & vbnewline & "   ** (две звездочки) - то же, но с сохранением порядка", "Расширенное создание папок", DateNow)
if IsEmpty(Fld) then Wscript.Quit

' ===== Обработка буфера обмена
if Fld="*" Or Fld="**" then
  If Fld="**" then num = 1 else num = 0
  Fld = CreateObject("HTMLFile").parentWindow.clipboardData.getData("Text")
  CrLfArr = Array(vbnewline, chr(13), chr(10), "||")
  For Each a In CrLfArr
    Fld = replace(Fld, a, "|")
  Next
  Fld = replace(Fld, Chr(9) & "|", "|")
  Fld = replace(Fld, Chr(9), " - ")
  Fld = replace(Fld, """", "")
End If

' ===== замена запрещенных символов
Sym = "/\*?"":<>"
For i = 1 To Len(Sym)
  Fld = Replace(Fld, Mid(Sym, i, 1), "_")
Next
For i=1 to 100
  Fld = replace(Fld, "  ", " ")
  Fld = replace(Fld, "- -", "-")
Next
Fld = replace(Fld, " - |", "|")

' ===== Основная обработка создания папок
For Each FldName In Split(Fld, "|")
  QuantityFlds = QuantityFlds + 1 ' общий счет количества создаваемых папок
  If num = 1 then
    k = k + 1
    number = right("000" & k, 4) & ". "
  End If
  Err.Number = 0
  if right(FldName, 3) = " - " and DelTire = 1 then FldName=left(FldName, len(FldName) - 3)
  FullpathNewFolder = WScript.Arguments(0) & number & Trim(FldName)
  If FldName <> "" then FSO.CreateFolder FullpathNewFolder
  If Err.Number <> 0 then ErrText = ErrText & vbnewline & "•  " & number & Trim(FldName)
Next

' ===== сообщение об ошибке при создании папок
If ErrText <> "" then
  msgbox "Ошибка создания папок, возможны следующие причины:" & vbnewline & "  1) Папки уже существуют" _
    & vbnewline & "  2) Вы пытаетесь создать папки с одинаковыми именами" & vbnewline _
    & "  3) Превышение максимальной длины пути" & vbnewline & ErrText
  Wscript.Quit
end if

' ===== если созданная папка ОДНА, то автоматический вход в нее в ТС
If QuantityFlds = 1 then 
  Set WshShell = CreateObject("WScript.Shell")
  TCP = WshShell.ExpandEnvironmentStrings("%commander_path%")
  WshShell.run """" & TCP & "\TOTALCMD.EXE"" /O /S """ & FullpathNewFolder & """"
End If

#3:  Author: keramer82 PostPosted: Wed Aug 30, 2023 14:50
    —
Monarch-LFV, спасибо. Только это мой первый скрипт для тотала. Боюсь я не могу разобраться, тем более в VBA.
Интуитивно понимаю, что нужно как-то ковертнуть вот эти строки в jv
Code:

Set WshShell = CreateObject("WScript.Shell")
  TCP = WshShell.ExpandEnvironmentStrings("%commander_path%")
  WshShell.run """" & TCP & "\TOTALCMD.EXE"" /O /S """ & FullpathNewFolder & """"

но моих невеликих познаний на это не хватает.
Ваш скрипт попробовал, он у меня в папку создаваемую не входит. Ну и для моих задач он слишком большой что ли. Мне нужно просто создавать папку "TEST" по нажатию горячей клавиши.
И как запускать с параметрами я пока не разобрался...

#4:  Author: Monarch-LFV PostPosted: Wed Aug 30, 2023 15:04
    —
keramer82
Создайте файл "Create_New_Folder_Extended.vbs" с содержимым, которое я написал выше. Данный файл перетащите на панель кнопок ТС, создастся кнопка. Далее нажмите "Изменить" в контекстном меню данной кнопки и в параметрах пропишите (вместе с кавычками): "%P"

#5:  Author: keramer82 PostPosted: Wed Aug 30, 2023 15:13
    —
Monarch-LFV, папка то создается. Кнопка срабатывает, выводится окно с просьбой ввести что-то, (что именно, не понятно, описание кракозябрами), но дата сегодняшняя уже стоит. Кликаю "ок", папка создается, в названии - то, что предлагалось ввести (дата). Но в созданную папку Тотал не заходит..

#6:  Author: Monarch-LFV PostPosted: Wed Aug 30, 2023 15:28
    —
keramer82
Кодировку файла VBS поменяйте на CP-1251.

#7:  Author: keramer82 PostPosted: Wed Aug 30, 2023 15:38
    —
Теперь понятен стал текст про звездочки. Но в создаваемую папку все равно не входит. Просто создает и все.

#8:  Author: Monarch-LFV PostPosted: Wed Aug 30, 2023 15:46
    —
keramer82
Какое вы вводите имя создаваемой папки? Верно ли скопировали текст скрипта? Верно ли задали параметры? В какой папке пытаетесь создать папку?

Добавлено спустя 11 минут:

keramer82 wrote:
Мне нужно просто создавать папку "TEST" по нажатию горячей клавиши.

Сокращенный скрипт для ваших нужд:
Code:
' Создать папку TEST и войти в нее
' Параметры "%P" (в кавычках)

On Error Resume Next
NewFolder="TEST"
FullpathNewFolder=WScript.Arguments(0) & "\" & NewFolder
set FSO = createobject ("Scripting.FileSystemObject")
FSO.CreateFolder FullpathNewFolder
Set WshShell = CreateObject("WScript.Shell")
TCP = WshShell.ExpandEnvironmentStrings("%commander_path%")
WshShell.run """" & TCP & "\TOTALCMD.EXE"" /O /S """ & FullpathNewFolder & """"

#9:  Author: keramer82 PostPosted: Wed Aug 30, 2023 16:07
    —
Пробовал вводить разные имена создаваемой папке. И на русском, и на латинице, и цифры. И просто кликал "ок". Текст скрипта скопировал, вставил, сохранил еще раз. Параметры буквально поставил – "%P" вместе с кавычками. Создавать папку пробовал в корне диска С. Пробовал во вложенных папках, например c:\Total Scripts\
Результат один и тот же — папка просто создается и все. Тотал внутрь этой папки, как бы она не называлась, и где бы не находилась, не заходит.
Тотал 10.00. Запрета на открытие второго Тотала нет.
Попробовал на другой машине, Тотал 8.01 — в создаваемую папку заходит! НО открывает второй Тотал Коммандер, что совсем не подходит. А остаться в том же Тотале, в котором создается папка можно? Может параметр какой-то еще прописать нужно...

#10:  Author: Monarch-LFV PostPosted: Wed Aug 30, 2023 16:16
    —
keramer82
Не знаю почему у вас не работает. Собственно, параметры /O /S - как раз и определяют действия ТС.
Читайте справку ТС полностью. Приведу только выдержки оттуда по этим ключам:
/O - Если Total Commander уже запущен, этот параметр активизирует его и передаёт путь (пути) из командной строки в эту копию программы (независимо от настройки в диалоге конфигурации, позволяющей открывать несколько окон Total Commander).
/S - Воспринимает переданные каталоги как исходный/целевой вместо левого/правого (для совместного применения с параметром /O). Например, каталог, переданный с ключом /R= будет воспринят как каталог назначения.
Попробуйте разобраться самостоятельно, так как у меня эти скрипты работают, как заявлено.
Для начала попробуйте отключить пропуск ошибок, то есть удалить (или закомментировать) строку On Error Resume Next. и посмотреть, не выведет ли ошибку.

#11:  Author: keramer82 PostPosted: Wed Aug 30, 2023 17:32
    —
Monarch-LFV
Спасибо огромное, что откликнулись. На Тотале 8.01 скрипт все таки заработал.
Указал конкретный путь к Тоталу и заработало! Папка создается и Тотал в нее входит.
Code:

' Создать папку TEST и войти в нее
' Параметры "%P" (в кавычках)

On Error Resume Next
NewFolder="TEST"
FullpathNewFolder=WScript.Arguments(0) & "\" & NewFolder
set FSO = createobject ("Scripting.FileSystemObject")
FSO.CreateFolder FullpathNewFolder
Set WshShell = CreateObject("WScript.Shell")
WshShell.run "C:\totalcmd\TOTALCMD64.EXE /O /S """ & FullpathNewFolder & """"

Правда Тоталу 10.00 это все до лампочки..
Но это не так уж и важно. Завтра снесу его и поставлю 8.01
А как теперь реализовать на VBA что если такая папка (TEST) уже есть, то создать папку TEST_1, TEST_2 и т.д? На js это просто делается, а вот как это написать на VBA, я вообще не могу представить... Помогите, пожалуйста Embarassed

#12:  Author: Monarch-LFV PostPosted: Thu Aug 31, 2023 03:52
    —
keramer82
1. Версия тотала тут совсем не причем, более того, использовать более старую версию ТС - неправильный в корне путь. У вас что-то с настройками не то, попробуйте поманипулировать с wincmd.ini (перенести со старой версии в новую / удалить, чтобы ТС создал чистую / провести анализ всех ключей путем удаления части и т.п.).
2. Не VBA, а VBS - это разные скриптовые языки, хоть и похожи.
3. собственно сам код для ваших нужд:
Code:
' Создать папку TEST и войти в нее, если существует, то добавить счетчик
' Параметры "%P" (в кавычках)

On Error Resume Next
NewFolder="TEST"
set FSO = createobject ("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
FullpathNewFolder=WScript.Arguments(0) & "\" & NewFolder
Do while FSO.FolderExists(FullpathNewFolder)
  i=i+1
  FullpathNewFolder=WScript.Arguments(0) & "\" & NewFolder & "_" & i
Loop
FSO.CreateFolder FullpathNewFolder
TCP = WshShell.ExpandEnvironmentStrings("%commander_exe%")
WshShell.run """" & TCP & """ /O /S """ & FullpathNewFolder & """"

4. В коде сменил переменную окружения на %commander_exe%, чтобы сам тотал определял битность, хотя и в прежнем варианте у меня работал как на 32-битном ТС, так и на 64-битном. Попробуйте в данном варианте.
5. Если не заработает как нужно, совет прежний - попробовать убрать обработчик ошибок в коде VBS (писал выше).

#13:  Author: keramer82 PostPosted: Thu Aug 31, 2023 06:23
    —
Monarch-LFV
Спасибо огромное! Все заработало и на 10.00 Тотал Коммандере. Просто вставил Ваш код в скрипт, и работает просто волшебно. Как тут на форуме можно отметить ответ как решение, не знаю, но это идеальное решение для моих задач! Как раз то, что и было нужно. Спасибо Вам огромное еще раз!



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group