Script Request

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

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

SVM
Сообщения: 47
Зарегистрирован: Чт окт 16, 2008 16:36

Сообщение SVM »

Batya
Спасибо, всё работает!
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Здравствуйте. Есть пара вопросов. Я новичок, и слабовато разбираюсь. Но пытаюсь...
Вот тут
http://forum.wincmd.ru/viewpost.php?p=14843
Я позаимствовал прекрасный скрипт.
Некоторое время он прослужил мне "по-полной" однако сейчас я столкнулся с проблемой.
Дело в том что искомый текст стал варьироваться. Причём заранее я не знаю каким он будет. И файлов много.. А все их надо подгонять под одну черту. (искомый текст хранится в XML файле, под тегом code. Сам текст варьируется от 100 до 2000. Менять надо на 220)

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

<code>1100</code>, <code>900</code>, <code>1800</code> ==> <code>220</code>
То-есть фактически мне понадобилось добавить к скрипту регулярное выражение поиска нужного текста. Я нашёл вот такое дело:

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

Set myRegExp = CreateObject("VBScript.RegExp")
myRegExp.Pattern = "<code (.*)</code>"
В отладчике, с подставленным текстом для поиска, вроде работает. Но как я не бился над ними, не сумел по-человечески подвязать их к выше упомянутому скрипту... Помогите пожалуйста. :?
PS: Он же собственно второй вопрос. Мне было бы очень удобно, если-бы я мог выделить папку(в каждой папке содержится один такой файл который надо править), и после этого запустить скрипт. Таким образом изменив файл находящийся внутри папки. Правка по-одному файлу меня устроит.
Прошу прощения за сумбурность. Пробился почти сутки с этими скриптами, и сейчас уже по сути засыпая пишу запрос. Если чего не понятно объяснил скажите я постараюсь разложить по-полочкам завтра утром....
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

taravasya писал(а):То-есть фактически мне понадобилось добавить к скрипту регулярное выражение поиска нужного текста.
taravasya писал(а):Мне было бы очень удобно, если-бы я мог выделить папку(в каждой папке содержится один такой файл который надо править), и после этого запустить скрипт. Таким образом изменив файл находящийся внутри папки. Правка по-одному файлу меня устроит.
vbs-скрипт работает по одному файлу:

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

'===============================================
' Замена текста в файле с помощью рег. выражений
'
' Параметры:
' {файл} {текст для поиска} {текст для замены}
'===============================================
Option Explicit
Dim FSO, F, Str1, Str2, Text
Set FSO = CreateObject("Scripting.FileSystemObject")
With WScript
  F    = .Arguments(0)
  Str1 = .Arguments(1)
  Str2 = .Arguments(2)
End With
F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F))

Text = FSO.OpenTextFile(F, 1).ReadAll
Text = RegExpReplace(Text, Str1, Str2)
FSO.OpenTextFile(F, 2).Write Text

Set FSO = Nothing
WScript.Quit 0

'Функция замены с помощью регулярных выражений
Function RegExpReplace(pText, pFindStr, pNewStr)
  Dim regEx
  Set regEx        = New RegExp
  regEx.Pattern    = pFindStr
  regEx.IgnoreCase = True
  regEx.Global     = True
  RegExpReplace    = regEx.Replace(pText, pNewStr)
  Set regEx        = Nothing
End Function
Твоя кнопка:
TOTALCMD#BAR#DATA
"%Commander_Path%\Utils\WHS\RegExpReplaceText.vbs"
"%p%n\Обрабатываемый файл.EXT" "<code>\d+</code>" "<code>220</code>"
%Commander_Path%\WCMICONS.DLL,14
Замена текста в файле с помощью рег. выражений



-1
Синий, зелёный, красный - подставляй собственные значения. Работает для текущей папки (под курсором).
Нет, я не сплю. Я просто медленно моргаю.
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Спасибо огромное! Это то что нужно. :D
Вообще молодец Вы, Batya.....
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

В нескольких темах форума встречается скрипты создающие файл из буфера обмена, я постоянно одним из них пользуюсь, но появились предложения по улучшению
1. В параметрах скрипта три параметра {путь} {имя файла} {расширение}
2. Скрипт бы проверял, если есть подобный файл в папке, то добавлял к файлу 01,02,03...
3. Это может касается не этой темы, интересует создание файла doc, docx, xls, xlsx с содержимым из буфера обмена
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A писал(а):В нескольких темах форума встречается скрипты
Нужно править каждый скрипт, поэтому подними темы, где эти скрипты приведены.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

где эти скрипты приведены
вот одна из ссылок:
создание файла из буфера обмена
а вот другой скрипт, его я тоже взял с форума, но ссылку найти не смог:

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

' Создаёт в текущем каталоге файл из буфера обмена
' Параметр "%PBuffer.txt"
CreateObject("Scripting.FileSystemObject").OpenTextFile(Wscript.Arguments(0),8,1).Write vbCrLf&CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")&vbCrLf&vbCrLf
Править нужно не все скрипты, а хотя бы один с условиями 1,2
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A писал(а):вот одна из ссылок:
создание файла из буфера обмена

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

'==========================================================
' Создание текстового файла с содержимым буфера обмена
'   по маске: имя_номер.расширение
'
' Параметры:
' {создаваемый файл} [{минимальное количество цифр номера}]
'==========================================================
Option Explicit
'====== Изменяемые параметры ==============================
Const IsQuestion = True 'Запрос на создание
'==========================================================
Dim FileName, Rank, Clip, NewPath, FSO, WSH, Mess, Title
FileName = WScript.Arguments(0)
If WScript.Arguments.Count > 1 Then
  Rank   = WScript.Arguments(1)
Else
  Rank   = 1
End If
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set WSH  = CreateObject("WScript.Shell")
Clip     = CreateObject("TCScript.Helper").GetTextFromClip

If Len(Clip) = 0 Then Quit

NewPath = NextName(GetPath(FileName))

If IsQuestion Then
  Mess = "Буфер обмена содержит текст. Создать файл" & vbNewLine &_
         """" & NewPath & """"                       & vbNewLine &_
         "с содержимым буфера обмена?"               & vbNewLine
  Title = "Создание текстового файла"
  If MsgBox(Mess, vbYesNo + vbQuestion, Title) = 7 Then Quit
End If

FSO.OpenTextFile(NewPath, 2, True).Write Clip

Quit

Function Quit
  Set WSH = Nothing
  Set FSO = Nothing
  WScript.Quit
End Function

Function NextName(pFilePath)
  Dim lPath, lName, lExt, li, lNum, lDlm, lNewPath
  lDlm  = "_"
  lPath = FSO.GetParentFolderName(pFilePath)
  lName = FSO.GetBaseName(pFilePath)
  lExt  = FSO.GetExtensionName(pFilePath)
  If Len(lPath) > 0 Then lPath = lPath & ""
  If Not FSO.FileExists(pFilePath) Then
    NextName = pFilePath
    Exit Function
  End If
  Do
    li = li + 1
    If li < 10^Rank Then
      lNum = Right(String(Rank, "0") & li, Rank)
    Else
      lNum = li
    End If
    lNewPath = lPath & lName & lDlm & lNum & "." & lExt
  Loop While FSO.FileExists(lNewPath)
  NextName = lNewPath
End Function

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A писал(а):а вот другой скрипт, его я тоже взял с форума, но ссылку найти не смог:Код:
' Создаёт в текущем каталоге файл из буфера обмена
' Параметр "%PBuffer.txt"
CreateObject("Scripting.FileSystemObject").OpenTextFile(Wscript.Arguments(0),8,1).Write vbCrLf&CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")&vbCrLf&vbCrLf
Это, в принципе, то же самое.
Основная фишка - TCScript.Helper не используется:

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

'==========================================================
' Создание текстового файла с содержимым буфера обмена
'   по маске: имя_номер.расширение
'
' Параметры:
' {создаваемый файл} [{минимальное количество цифр номера}]
'==========================================================
Option Explicit
'====== Изменяемые параметры ==============================
Const IsQuestion = True 'Запрос на создание
'==========================================================
Dim FileName, Rank, Clip, NewPath, FSO, WSH, Mess, Title
FileName = WScript.Arguments(0)
If WScript.Arguments.Count > 1 Then
  Rank   = WScript.Arguments(1)
Else
  Rank   = 1
End If
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set WSH  = CreateObject("WScript.Shell")
Clip     = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")

If Len(Clip) = 0 Or IsNull(Clip) Then Quit

NewPath = NextName(GetPath(FileName))

If IsQuestion Then
  Mess = "Буфер обмена содержит текст. Создать файл" & vbNewLine &_
         """" & NewPath & """"                       & vbNewLine &_
         "с содержимым буфера обмена?"               & vbNewLine
  Title = "Создание текстового файла"
  If MsgBox(Mess, vbYesNo + vbQuestion, Title) = 7 Then Quit
End If

FSO.OpenTextFile(NewPath, 2, True).Write Clip

Quit

Function Quit
  Set WSH = Nothing
  Set FSO = Nothing
  WScript.Quit
End Function

Function NextName(pFilePath)
  Dim lPath, lName, lExt, li, lNum, lDlm, lNewPath
  lDlm  = "_"
  lPath = FSO.GetParentFolderName(pFilePath)
  lName = FSO.GetBaseName(pFilePath)
  lExt  = FSO.GetExtensionName(pFilePath)
  If Len(lPath) > 0 Then lPath = lPath & ""
  If Not FSO.FileExists(pFilePath) Then
    NextName = pFilePath
    Exit Function
  End If
  Do
    li = li + 1
    If li < 10^Rank Then
      lNum = Right(String(Rank, "0") & li, Rank)
    Else
      lNum = li
    End If
    lNewPath = lPath & lName & lDlm & lNum & "." & lExt
  Loop While FSO.FileExists(lNewPath)
  NextName = lNewPath
End Function

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Спасибо Batya! Всё очень шикарно - быстро и функционально!
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Периодически приходится в файлах делать несколько замен и причом не одну, я пользуюсь скриптом из темы
http://forum.wincmd.ru/viewtopic.php?t= ... highlight=

, нельзя ли сделать серию замен или поиск и замена будут записаны в файле - пунктуация любая, может так,
"строка поиска1" "замена1"
"строка поиска2" "замена2"
"строка поиска3" "замена3"
...
т.е. поиск и замена в выделенных файлов по строчному списку поиска и замен из файла...
Аватара пользователя
AlexTex
Сообщения: 42
Зарегистрирован: Чт июл 10, 2008 19:00

Сообщение AlexTex »

Batya
Скрипт - супер! Огромное спасибо! :D
P.S. А можно сделать так, чтобы не выскакивало окошко "Буфер обмена содержит текст...", а сразу создавался файл?
Пробовал убрать блок "If IsQuestion Then", файл создается, но появляется только после принудительного перечитывания панели :(
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

AlexTex писал(а):А можно сделать так, чтобы не выскакивало окошко "Буфер обмена содержит текст...", а сразу создавался файл?
Это делается изменением строки Const IsQuestion = False 'Запрос на создание
AlexTex писал(а):файл создается, но появляется только после принудительного перечитывания панели
Настройка –> Автообновление. Проверь галки.
Аватара пользователя
AlexTex
Сообщения: 42
Зарегистрирован: Чт июл 10, 2008 19:00

Сообщение AlexTex »

Tol!k, уточни, плиз, где прописать False, поскольку строки Const IsQuestion нет, а "метод тыка" не срабатывает - выдает ошибку "Имя было переопределено".

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

If IsQuestion Then 
  Mess = "Буфер обмена содержит текст. Создать файл" & vbNewLine &_ 
         """" & NewPath & """"                       & vbNewLine &_ 
         "с содержимым буфера обмена?"               & vbNewLine 
  Title = "Создание текстового файла" 
  If MsgBox(Mess, vbYesNo + vbQuestion, Title) = 7 Then Quit 
End If 
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

AlexTex писал(а):Tol!k, уточни, плиз, где прописать False, поскольку строки Const IsQuestion нет
В шапке скрипта:
'====== Изменяемые параметры ==============================
Const IsQuestion = False 'Запрос на создание
'==========================================================
Нет, я не сплю. Я просто медленно моргаю.
Ответить