View previous topic :: View next topic |
Author |
Message |
HEXFIX
Joined: 25 Jun 2010 Posts: 173 Location: Калининград
|
(Separately) Posted: Fri Apr 05, 2019 21:09 Post subject: |
|
|
Прошу помощи.
Использую вот такой скрипт
Code: | 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 |
Если честно, не помню, где я его взял, и кто автор
А можно ли его доработать так, чтобы при повторном применении скрипта создавался бы файл с таким же названием, но с добавлением счётчика? Ну или, если доработать таки нельзя, написать новый с такой возможностью? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Apr 05, 2019 21:24 Post subject: |
|
|
Дубль два?
HEXFIX wrote: | чтобы при повторном применении скрипта создавался бы файл с таким же названием, но с добавлением счётчика? | Последний скрипт в теме это и делает. Также см. этот. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
HEXFIX
Joined: 25 Jun 2010 Posts: 173 Location: Калининград
|
(Separately) Posted: Fri Apr 05, 2019 21:38 Post subject: |
|
|
Да, кстати, совсем забыл там отписаться, что всё каким-то образом само собой заработало
Буду внимательнее читать топик. А то пробежался по диагонали глазами, увидел, что что-то там не работает, ну и...
Спасибо, Flasher, в который раз уже выручаешь |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Apr 05, 2019 22:50 Post subject: |
|
|
HEXFIX
Пож-та.
Но вообще первый скрипт сейчас выглядит поуниверсальней: Code: | '================================ 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) & """" |
_________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Mon Dec 02, 2019 17:15 Post subject: |
|
|
Flasher
Спасибо за Ваши разъяснения и советы.
Спасибо за сообщение о программе Listary - интересная, решил попробовать.
Вставка содержимого буфера в новый файл (текст/изображениe) - функция нужная.
Мне она нужна для вставки картинок, скопированных в буфер из интернета. Например, наверху страницы форума есть картинка Total Commander, её через меню браузера копирую в буфер, теперь её нужно вставить в виде файла.
1. Попробовал скрипт, который Вы правили, из ветки - работает, но только с текстом. Картинки из буфера не вставляет.
2. Пробовал скрипт от Бати - работает, но только с текстом. Картинки из буфера не вставляет.
3. Попробовал батник из шапки - работает, но неудобно:
- файлы создаются, но без расширения - даже исходные картинки в *.png не вставляются в виде файла со своим расширением (как было написано, по умолчанию). Нужно каждый раз переключать раскладку на англ. и дописывать расширение.
- для текста тоже нужно при каждой вставке дописывать расширения
- батник работает через обязательный вывод запрашивающего окна, т.е. не имеет опции работать в скрытом режиме.
4. В Total commander есть встроенная опция (cm_PasteFromClipboard) - вставки файла из буфера обмена. По ней можно вставлять картинки из буфера. Это здорово.
Таким образом, у меня сейчас на панели команд 2 кнопки: одна для вставки текста, другая - для вставки картинок.
Но хотелось бы автоматизации
Т.е. чтобы была 1 кнопка и по ней, исходя из содержимого буфера, вставлялась либо картинка, либо текст в новый файл (при совпадении имен - оптимальным, думаю, будет использование счётчика).
Есть какие-нибудь идеи? Можно это реализовать? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Dec 12, 2019 20:55 Post subject: |
|
|
KarS wrote: | Мне она нужна для вставки картинок, скопированных в буфер из интернета. | Для этого в контекстном меню браузера должна быть возможноть сохранять изображение через диалог. Для популярных браузеров есть и вспомогательные аддоны, тащащие любые картинки в исходном виде. А через буфер можно разве что в своём формате записать. Не думаю, что исходный код писался под браузер. Я объяснял, как его завести. Но раз консоли нам мешают, то вот крайний вариант с допилом:
Code: | '================================ 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) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Sat Dec 14, 2019 15:06 Post subject: |
|
|
Flasher,
Большое спасибо!
У меня работает отлично!
Вставляется даже с именами, содержащими пробелы, а также по путям, где есть пробелы. Файлы распознаются на ура!
Может можно инструкцию маленько подписать: /d — ключ ввода имени через диалог - работает, если явно указано имя создаваемого файла.
Иначе этот ключ не срабатывает. - Я сразу не разобрался.
Также пришлось маленько повозиться с кнопкой.
Привожу свой вариант, может кому нужно будет для быстрой вставки.
Code: | TOTALCMD#BAR#DATA
c:\Program Files\totalcmd\Utils\WHS\PasteBufer.vbs "%COMMANDER_EXE%"
Bufer "%P"
C:\Program Files\totalcmd\WCMICONS.DLL,45
-1 |
|
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sat Dec 14, 2019 15:19 Post subject: |
|
|
KarS wrote: | /d — ключ ввода имени через диалог - работает, если явно указано имя создаваемого файла. Иначе этот ключ не срабатывает. | Ничего подобного. Там же в первом примере указаны пустые кавычки для этого. Ключ /d лишь регулирует наличие диалога при указании имени.
По коду кнопки напрашивается замечание — не выполнено второе условие, а значит, под TC 9.10+ x64 не заведётся.
И, как описано в памятке, скрипт надо тянуть на тулбар, чтобы вместо c:\Program Files\totalcmd там появился %COMMANDER_PATH%. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Last edited by Flasher on Sat Dec 14, 2019 15:57; edited 1 time in total |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Sat Dec 14, 2019 15:55 Post subject: |
|
|
Использовал: "" "%P"
т.е. без ключа /d
В этом случае диалог ввода появляется. Использовал эти же параметры с ключом - диалог ввода тоже появляется.
Вот и получается, что есть ключ, что его нет - диалог ввода появляется. Я это имел в виду.
Про второе условие не знаю как его выполнить. Куда нужно вводить "%$SystemX86%\wscript.exe" ?
У меня Win7 32b - поэтому срабатывает. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sat Dec 14, 2019 16:06 Post subject: |
|
|
Ещё раз вернёмся к фразе: KarS wrote: | работает, если явно указано имя создаваемого файла. | "Работает" = "диалог появляется" в моём понимании. Я пишу, что диалог появится и без явного указания имени. И это вполне очевидная логика. С пустым параметром получи диалог, с непустым — контроль ключом. Зачем объяснять в шапке то, что и так понятно?
Второе условие банально. wscript.exe — это интерпретатор, о чём сказано снизу памятки. Логично вводить его в начале поля "Команда:". Т.е.:
Code: | %$SystemX86%\wscript.exe "%COMMANDER_PATH%\Utils\WHS\PasteBufer.vbs" "%COMMANDER_EXE%" | У меня хоткей подвязан к em_CreateFileWithClipData. Я бы и скрипт назвал CreateFileWithClipData.vbs, т.к. PasteBufer не совсем о том. Bufer в английском — это не то же, что Clipboard.
KarS wrote: | У меня Win7 32b - поэтому срабатывает. | Я сообразил. Но лучше иметь рабочий вариант для разных ситуаций, в т. ч. для переноски (флэшка, внешник). _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Last edited by Flasher on Sat Dec 14, 2019 16:29; edited 1 time in total |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Sat Dec 14, 2019 16:28 Post subject: |
|
|
"Банально" - для гуру.
Для обычных пользователей - есть памятка - это предусмотрительно, спасибо.
Но в ней написано: "Для 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"
Для начинающих понятно, когда описание составлено пошагово и подробно. Шаг влево-вправо - это же крах |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sat Dec 14, 2019 16:37 Post subject: |
|
|
Гуру-шмуру... Всё хочу смотать в Индию, посмотреть на них. ))
Я не любитель раздувать шапки. Меня уже как-то заставили, в итоге шапка стала размером с код.
А в памятке это писать не надо, т. к. там в пункте 8 всё описано. Это не общий критерий для скриптов, а конкретное условие для определённых. Тем более что касается 9.10+, где появилась SHGetKnownFolderPath.
Любой скрипт запускается от какой-то интерпретирующей программы. Поэтому у меня и написано "запуск от".
Кстати, почему папка WHS называется? Это же неправильно. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Sun Dec 15, 2019 06:54 Post subject: |
|
|
Название папки WHS увидел в двух примерах, приведённых в TCKB.chm: в статьях "Кнопка для создания файла" и "Снятие/установка атрибутов с файлов".
Вот и скопировал.
А в чём неправильность? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Dec 15, 2019 07:28 Post subject: |
|
|
Потому что две последние буквы местами перепутаны. WSH = Windows Script Host.
Вижу косячок. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
KarS
Joined: 21 Apr 2006 Posts: 102 Location: г. Абакан
|
(Separately) Posted: Sun Dec 15, 2019 09:11 Post subject: |
|
|
Понятно, у себя поправлю. |
|
Back to top |
|
|
|
|
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
|