Вставка содержимого буфера в новый файл (текст/изображениe)

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

Прошу помощи.
Использую вот такой скрипт

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

Option Explicit
Dim FileName
'========== Изменяемые параметры =======================
FileName = "Новый файл.txt" 'Имя создаваемого файла
'=======================================================
Dim TCS, Clip, Btn, FSO, OTL, Mess, Title
Set TCS = CreateObject("TCScript.Helper")
Clip = TCS.GetTextFromClip
Set TCS = Nothing
 
If Len(Clip) > 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(FileName) Then
Mess = "Буфер обмена содержит текст." & vbNewLine & _
"Заменить содержимое файла " & FileName & _
" текстом из буфера обмена?" & vbNewLine
Title = "Замена содержимого файла"
Else
Mess = "Буфер обмена содержит текст." & vbNewLine & _
"Создать файл " & FileName & _
" с содержимым буфера обмена?" & vbNewLine
Title = "Создание текстового файла"
End If
Btn = MsgBox(Mess, vbYesNo + vbQuestion, Title)
If Btn = 7 Then 'Кнопка No
Set FSO = Nothing
WScript.Quit
End If
Else
WScript.Quit
End If
 
Set OTL = FSO.OpenTextFile(FileName, 2, True)
OTL.Write Clip
OTL.Close
 
Set OTL = Nothing
Set FSO = Nothing
WScript.Quit
Если честно, не помню, где я его взял, и кто автор :D
А можно ли его доработать так, чтобы при повторном применении скрипта создавался бы файл с таким же названием, но с добавлением счётчика? Ну или, если доработать таки нельзя, написать новый с такой возможностью? :D
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Дубль два?
HEXFIX писал(а):чтобы при повторном применении скрипта создавался бы файл с таким же названием, но с добавлением счётчика?
Последний скрипт в теме это и делает. Также см. этот.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

Да, кстати, совсем забыл там отписаться, что всё каким-то образом само собой заработало :D :D :D
Буду внимательнее читать топик. А то пробежался по диагонали глазами, увидел, что что-то там не работает, ну и...
Спасибо, Flasher, в который раз уже выручаешь :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HEXFIX
Пож-та.
[cut="Но вообще первый скрипт сейчас выглядит поуниверсальней:"]

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

'================================ VBS ===============================
' Назначение: cоздание файла с текстом из буфера обмена (при наличии)
'
' Условия:  1) первый параметр в поле "Команда:": "%COMMANDER_EXE%"
'           2) на Windows x64 запуск от %WinDir%\SysWOW64\wscript.exe
'
' Параметры: "<имя файла>" "<путь назначения>"
'            /d  —  ключ ввода имени через диалог
'
' Примеры:   "" "%P"   |   "%O.lst" "%P"   |   File "%T" /d
'=============================================== Автор: Flasher © ===
Option Explicit
Const Title = " Создание файла с текстом из буфера обмена"
Dim P, FSO, WSS, Clip, N, S, R, i, Enc, Ext, F, FP, c
Set P = WSH.Arguments : If P.UnNamed.Count < 3 Then _
MsgBox "Укажите 3 параметра!", 4144, Title & "      " : WSH.Quit
Set WSS = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
With GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69)")
  .GetFromClipboard : On Error Resume Next : Clip = .GetText
End With
If Err.Number = 0 Then On Error Goto 0 Else WSH.Quit
N = P(1) : If P.Named.Exists("d") Or FSO.GetBaseName(N) = "" Then _
N = RTrim(InputBox(String(5, vbCr) & "Введите имя файла:", Title, N,,_
(CreateObject("htmlfile").parentwindow.self.screen.Height-18240/WSS._
RegRead("HKCU\Control Panel\Desktop\WindowMetrics\AppliedDPI"))*7.5))
S = Split(": ? * "" \ / | < >") : If N = "" Then WSH.Quit
R = Array(-230,-225,-246,698,-24,-24,-24,706,707)
For i = 0 To 8 : N = Replace(N, S(i), ChrW(R(i))) : Next
If InStr(N, ".") = 0 Then N = N & ".txt"
With New Regexp
  .Pattern = "[^\s!-‚-›\u0080-\u00FF\u0400-\u04FF\u20A0-\u20CF\u2100-\u214F\w‘’–—]"
  .Global = True : If .Test(Clip) Then Enc = True Else Enc = False
End With : Ext = "." & FSO.GetExtensionName(N) : If Ext = "." Then Ext = ""
F = "\\?\" & P(2) & FSO.GetBaseName(N) : FP = F & Ext
While FSO.FileExists(FP) Or FSO.FolderExists(FP)
  c = c + 1 : FP = F & " (" & c & ")" & Ext
Wend : If Len(FP) < 264 Then F = Mid(FP, 5) Else F = FP
FSO.CreateTextFile(F, 1, Enc).Write Clip
WSS.Exec P(0) & " /A /O /S """ & Mid(FP, 5) & """"
[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

Flasher
Спасибо за Ваши разъяснения и советы.
Спасибо за сообщение о программе Listary - интересная, решил попробовать.

Вставка содержимого буфера в новый файл (текст/изображениe) - функция нужная.
Мне она нужна для вставки картинок, скопированных в буфер из интернета. Например, наверху страницы форума есть картинка Total Commander, её через меню браузера копирую в буфер, теперь её нужно вставить в виде файла.

1. Попробовал скрипт, который Вы правили, из ветки - работает, но только с текстом. Картинки из буфера не вставляет.

2. Пробовал скрипт от Бати - работает, но только с текстом. Картинки из буфера не вставляет.

3. Попробовал батник из шапки - работает, но неудобно:
- файлы создаются, но без расширения - даже исходные картинки в *.png не вставляются в виде файла со своим расширением (как было написано, по умолчанию). Нужно каждый раз переключать раскладку на англ. и дописывать расширение.
- для текста тоже нужно при каждой вставке дописывать расширения
- батник работает через обязательный вывод запрашивающего окна, т.е. не имеет опции работать в скрытом режиме.

4. В Total commander есть встроенная опция (cm_PasteFromClipboard) - вставки файла из буфера обмена. По ней можно вставлять картинки из буфера. Это здорово. :)

Таким образом, у меня сейчас на панели команд 2 кнопки: одна для вставки текста, другая - для вставки картинок.
Но хотелось бы автоматизации :roll:
Т.е. чтобы была 1 кнопка и по ней, исходя из содержимого буфера, вставлялась либо картинка, либо текст в новый файл (при совпадении имен - оптимальным, думаю, будет использование счётчика).

Есть какие-нибудь идеи? Можно это реализовать?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KarS писал(а):Мне она нужна для вставки картинок, скопированных в буфер из интернета.
Для этого в контекстном меню браузера должна быть возможноть сохранять изображение через диалог. Для популярных браузеров есть и вспомогательные аддоны, тащащие любые картинки в исходном виде. А через буфер можно разве что в своём формате записать. Не думаю, что исходный код писался под браузер. Я объяснял, как его завести. Но раз консоли нам мешают, то вот крайний вариант с допилом:

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

'================================ VBS ===============================
' Создание файла с текстом или растром из буфера обмена (при наличии)
'
' Условия:   1) первый параметр в поле "Команда:": "%COMMANDER_EXE%"
' 2) для обратной совместимости — запуск от %$SystemX86%\wscript.exe
'
' Параметры: "<имя файла>" "<путь назначения>"
'            /d  —  ключ ввода имени через диалог
'
' Примеры:   "" "%P"   |   "%O.lst" "%P"   |   File "%T" /d
'
Option Explicit
'====================== Путь к утилите NirCmd =======================
Const NirCmd = """%COMMANDER_PATH%\Utils\NirCmd\nircmd.exe"""
'=============================================== Автор: Flasher © ===
Const Title = " Создание файла с текстом из буфера обмена"
Dim P, FSO, WSS, Clip, N, S, R, i, Enc, Ext, F, FP, c
Set P = WSH.Arguments : If P.UnNamed.Count < 3 Then _
MsgBox "Укажите 3 параметра!", 4144, Title & "      " : WSH.Quit
Set WSS = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
With GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69)")
  .GetFromClipboard : If .GetFormat(0) Then WSH.Quit
  If .GetFormat(1) Then Clip = .GetText : If Len(Clip) = 0 Then WSH.Quit
End With
N = P(1) : If P.Named.Exists("d") Or FSO.GetBaseName(N) = "" Then _
N = RTrim(InputBox(String(5, vbCr) & "Введите имя файла:", Title, N,,_
(CreateObject("htmlfile").parentwindow.self.screen.Height-18240/WSS._
RegRead("HKCU\Control Panel\Desktop\WindowMetrics\AppliedDPI"))*7.5))
S = Split(": ? * "" \ / | < >") : If N = "" Then WSH.Quit
R = Array(-230,-225,-246,698,-24,-24,-24,706,707)
For i = 0 To 8 : N = Replace(N, S(i), ChrW(R(i))) : Next
Ext = "." & FSO.GetExtensionName(N)
If IsEmpty(Clip) Then
  If InStr(1, ".bmg.gif.jpg.png.tif.tiff.", Ext &_
  ".", 1) = 0 Then Ext = ".jpg" : N = FSO.GetBaseName(N)
ElseIf Ext = "." Then Ext = ".txt" : N = N & Ext
End If
F = "\\?" & P(2) & FSO.GetBaseName(N) : FP = F & Ext
While FSO.FileExists(FP) Or FSO.FolderExists(FP)
  c = c + 1 : FP = F & " (" & c & ")" & Ext
Wend : If Len(FP) < 264 Then F = Mid(FP, 5) Else F = FP
If IsEmpty(Clip) Then
  WSS.Run NirCmd & " clipboard saveimage """ & F & """",,1
Else
  With New Regexp
    .Pattern = "[^\s!-‚-›\u0080-\u00FF\u0400-\u04FF\u20A0-\u20CF\u2100-\u214F\w‘’–—]"
    .Global = True : If .Test(Clip) Then Enc = True Else Enc = False
  End With : FSO.CreateTextFile(F, 1, Enc).Write Clip
End If
If FSO.FileExists(F) Then WSS.Exec P(0) & " /A /O /S """ & Mid(FP, 5) & """"
Set P = Nothing : Set FSO = Nothing : Set WSS = Nothing
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

Flasher,
Большое спасибо!
У меня работает отлично! :D

Вставляется даже с именами, содержащими пробелы, а также по путям, где есть пробелы. Файлы распознаются на ура!

Может можно инструкцию маленько подписать: /d — ключ ввода имени через диалог - работает, если явно указано имя создаваемого файла.
Иначе этот ключ не срабатывает. - Я сразу не разобрался.

Также пришлось маленько повозиться с кнопкой.
Привожу свой вариант, может кому нужно будет для быстрой вставки.

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

TOTALCMD#BAR#DATA
c:\Program Files\totalcmd\Utils\WHS\PasteBufer.vbs "%COMMANDER_EXE%"
Bufer "%P"
C:\Program Files\totalcmd\WCMICONS.DLL,45



-1
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KarS писал(а):/d — ключ ввода имени через диалог - работает, если явно указано имя создаваемого файла. Иначе этот ключ не срабатывает.
Ничего подобного. Там же в первом примере указаны пустые кавычки для этого. Ключ /d лишь регулирует наличие диалога при указании имени.

По коду кнопки напрашивается замечание — не выполнено второе условие, а значит, под TC 9.10+ x64 не заведётся.
И, как описано в памятке, скрипт надо тянуть на тулбар, чтобы вместо c:\Program Files\totalcmd там появился %COMMANDER_PATH%.
Последний раз редактировалось Flasher Сб дек 14, 2019 14:57, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

Использовал: "" "%P"
т.е. без ключа /d
В этом случае диалог ввода появляется. Использовал эти же параметры с ключом - диалог ввода тоже появляется.
Вот и получается, что есть ключ, что его нет - диалог ввода появляется. Я это имел в виду.
Про второе условие не знаю как его выполнить. Куда нужно вводить "%$SystemX86%\wscript.exe" ?
У меня Win7 32b - поэтому срабатывает.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Ещё раз вернёмся к фразе:
KarS писал(а):работает, если явно указано имя создаваемого файла.
"Работает" = "диалог появляется" в моём понимании. Я пишу, что диалог появится и без явного указания имени. И это вполне очевидная логика. С пустым параметром получи диалог, с непустым — контроль ключом. Зачем объяснять в шапке то, что и так понятно?

Второе условие банально. wscript.exe — это интерпретатор, о чём сказано снизу памятки. Логично вводить его в начале поля "Команда:". Т.е.:

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

%$SystemX86%\wscript.exe "%COMMANDER_PATH%\Utils\WHS\PasteBufer.vbs" "%COMMANDER_EXE%"
У меня хоткей подвязан к em_CreateFileWithClipData. Я бы и скрипт назвал CreateFileWithClipData.vbs, т.к. PasteBufer не совсем о том. Bufer в английском — это не то же, что Clipboard.
KarS писал(а):У меня Win7 32b - поэтому срабатывает.
Я сообразил. Но лучше иметь рабочий вариант для разных ситуаций, в т. ч. для переноски (флэшка, внешник).
Последний раз редактировалось Flasher Сб дек 14, 2019 15:29, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

"Банально" - для гуру.
Для обычных пользователей - есть памятка - это предусмотрительно, спасибо.
Но в ней написано: "Для VBScript нужно смотреть файл %WINDIR%\SYSTEM32\wscript.exe".
Из этого не понятно, что для кнопок меню в строке команда нужно писать %$SystemX86%\wscript.exe "%COMMANDER_PATH%\Utils\WHS\PasteBufer.vbs"...

Возможно, в памятке есть смысл дописать, что для обратной совместимости в 64bit-системах для кнопок меню TotalCommander в строке команда перед именем скрипта (с адресом) следует указывать %$SystemX86%\wscript.exe.
Например, %$SystemX86%\wscript.exe "%COMMANDER_PATH%\Utils\WHS\script.vbs"

Для начинающих понятно, когда описание составлено пошагово и подробно. Шаг влево-вправо - это же крах :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Гуру-шмуру... Всё хочу смотать в Индию, посмотреть на них. ))

Я не любитель раздувать шапки. Меня уже как-то заставили, в итоге шапка стала размером с код. :lol:
А в памятке это писать не надо, т. к. там в пункте 8 всё описано. Это не общий критерий для скриптов, а конкретное условие для определённых. Тем более что касается 9.10+, где появилась SHGetKnownFolderPath.
Любой скрипт запускается от какой-то интерпретирующей программы. Поэтому у меня и написано "запуск от".

Кстати, почему папка WHS называется? Это же неправильно.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

Название папки WHS увидел в двух примерах, приведённых в TCKB.chm: в статьях "Кнопка для создания файла" и "Снятие/установка атрибутов с файлов".
Вот и скопировал.
А в чём неправильность?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Потому что две последние буквы местами перепутаны. WSH = Windows Script Host.
Вижу косячок.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
KarS
Сообщения: 102
Зарегистрирован: Пт апр 21, 2006 16:43
Откуда: г. Абакан

Сообщение KarS »

Понятно, у себя поправлю. :)
Ответить