Страница 1 из 1

Как войти в папку из скрипта в Тотал Коммандер?

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

Код: Выделить всё

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();

Добавлено: Ср авг 30, 2023 13:14
Monarch-LFV
keramer82
Делюсь своим скриптом VBS для расширенного создания папок, делал сугубо для своих нужд. Можете или пользоваться им, или просто подсмотреть решение:

Код: Выделить всё

' Расширенное создание папок
' Параметры "%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

Добавлено: Ср авг 30, 2023 13:50
keramer82
Monarch-LFV, спасибо. Только это мой первый скрипт для тотала. Боюсь я не могу разобраться, тем более в VBA.
Интуитивно понимаю, что нужно как-то ковертнуть вот эти строки в jv

Код: Выделить всё

Set WshShell = CreateObject("WScript.Shell")
  TCP = WshShell.ExpandEnvironmentStrings("%commander_path%")
  WshShell.run """" & TCP & "\TOTALCMD.EXE"" /O /S """ & FullpathNewFolder & """"
но моих невеликих познаний на это не хватает.
Ваш скрипт попробовал, он у меня в папку создаваемую не входит. Ну и для моих задач он слишком большой что ли. Мне нужно просто создавать папку "TEST" по нажатию горячей клавиши.
И как запускать с параметрами я пока не разобрался...

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

Добавлено: Ср авг 30, 2023 14:13
keramer82
Monarch-LFV, папка то создается. Кнопка срабатывает, выводится окно с просьбой ввести что-то, (что именно, не понятно, описание кракозябрами), но дата сегодняшняя уже стоит. Кликаю "ок", папка создается, в названии - то, что предлагалось ввести (дата). Но в созданную папку Тотал не заходит..

Добавлено: Ср авг 30, 2023 14:28
Monarch-LFV
keramer82
Кодировку файла VBS поменяйте на CP-1251.

Добавлено: Ср авг 30, 2023 14:38
keramer82
Теперь понятен стал текст про звездочки. Но в создаваемую папку все равно не входит. Просто создает и все.

Добавлено: Ср авг 30, 2023 14:56
Monarch-LFV
keramer82
Какое вы вводите имя создаваемой папки? Верно ли скопировали текст скрипта? Верно ли задали параметры? В какой папке пытаетесь создать папку?

Добавлено спустя 11 минут:
keramer82 писал(а):Мне нужно просто создавать папку "TEST" по нажатию горячей клавиши.
Сокращенный скрипт для ваших нужд:

Код: Выделить всё

' Создать папку 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 & """"

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

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

Добавлено: Ср авг 30, 2023 16:32
keramer82
Monarch-LFV
Спасибо огромное, что откликнулись. На Тотале 8.01 скрипт все таки заработал.
Указал конкретный путь к Тоталу и заработало! Папка создается и Тотал в нее входит.

Код: Выделить всё

' Создать папку 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, я вообще не могу представить... Помогите, пожалуйста :oops:

Добавлено: Чт авг 31, 2023 02:52
Monarch-LFV
keramer82
1. Версия тотала тут совсем не причем, более того, использовать более старую версию ТС - неправильный в корне путь. У вас что-то с настройками не то, попробуйте поманипулировать с wincmd.ini (перенести со старой версии в новую / удалить, чтобы ТС создал чистую / провести анализ всех ключей путем удаления части и т.п.).
2. Не VBA, а VBS - это разные скриптовые языки, хоть и похожи.
3. собственно сам код для ваших нужд:

Код: Выделить всё

' Создать папку 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 (писал выше).

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