Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена текста из другого файла (http://forum.oszone.net/showthread.php?t=245273)

ul9 23-10-2012 01:58 2010510

Замена текста из другого файла
 
Всем привет!
Решила снова прибегнуть к помощи форумчан :)
Попробую описать подробно проблему. Есть папка (test) с файлами и подпапками, содержащими разные файлы. Созданы дополнительно два текстовых файла. Из первого файла берём образец (многострочный текстовый файл), т.е. то, что надо найти в файлах папок test. А второй файл это то, на что нужно заменить найденное. Хотелось бы, чтобы можно было задавать маску поиска (strMask = "*.txt")

ul9 23-10-2012 02:02 2010512

Пробовала с gsar и sed экспериментировать, но что-то не получилось добиться поиска текста из файла-образца.

Код:

@echo off
setlocal

set "replace=some text"
sed "s/zamena/%replace%/g" test1.txt 1>test2.txt

если бы можно было задавать путь
set "replace=C:\test\example.txt"

ul9 23-10-2012 17:15 2010795

Нашла ещё вот такой скрипт, но опять-таки заменяет не из текстового файла

[cscript|wscript] replace.vbs Find Replacewith File
Find … Required. Substring being searched for.
Replacewith … Required. Replacement substring.
File … Source and destination file for the replacement

Код:

Dim FileName, Find, ReplaceWith, FileContents, dFileContents
Find        = WScript.Arguments(0)
ReplaceWith  = WScript.Arguments(1)
FileName    = WScript.Arguments(2)

'Read source text file
FileContents = GetFile(FileName)

'replace all string In the source file
dFileContents = replace(FileContents, Find, ReplaceWith, 1, -1, 1)

'Compare source And result
if dFileContents <> FileContents Then
  'write result If different
  WriteFile FileName, dFileContents

  Wscript.Echo "Replace done."
  If Len(ReplaceWith) <> Len(Find) Then 'Can we count n of replacements?
    Wscript.Echo _
    ( (Len(dFileContents) - Len(FileContents)) / (Len(ReplaceWith)-Len(Find)) ) & _
    " replacements."
  End If
Else
  Wscript.Echo "Searched string Not In the source file"
End If

'Read text file
function GetFile(FileName)
  If FileName<>"" Then
    Dim FS, FileStream
    Set FS = CreateObject("Scripting.FileSystemObject")
      on error resume Next
      Set FileStream = FS.OpenTextFile(FileName)
      GetFile = FileStream.ReadAll
  End If
End Function

'Write string As a text file.
function WriteFile(FileName, Contents)
  Dim OutStream, FS

  on error resume Next
  Set FS = CreateObject("Scripting.FileSystemObject")
    Set OutStream = FS.OpenTextFile(FileName, 2, True)
    OutStream.Write Contents
End Function


Iska 23-10-2012 18:52 2010870

Цитата:

Цитата ul9
Из первого файла берём образец (многострочный текстовый файл), т.е. то, что надо найти в файлах папок test. А второй файл это то, на что нужно заменить найденное. »

Выложите архив с примером: «первый файл» — что заменять, «второй файл» — на что заменять, и образец файла — где заменять.

ul9 23-10-2012 19:22 2010885

Вложений: 1
Вот, но это не мой пример. Просто всегда текст (заменяемый) разный и выкладывать конкретный случай не имеет смысла. Я для каждой замены продублирую скрипт со своими заменами. В архиве заменять нужно в фале html, но иногда также приходится заменять и в файлах яваскрипта, не затрагивая html. Поэтому хотелось бы, чтобы можно было выбирать тип файла (html, js..)

Iska 23-10-2012 22:51 2010992

ul9, тип файла не важен. Важна кодировка. Особенно желательно, чтобы она совпадала у тех файлов, в которых ищем, так и у тех файлов, которые используются в качестве источников фрагментов поиска и замены. В приведённом Вами примере это не так: «work.htm» имеет кодировку windows-1251, а «Найти это.txt» и «заменить этим.txt» — UTF-8, да ещё и без BOM. Что, при наличии во фрагменте поиска кирилицы в приведённом примере делает невозможным простой поиск и замену.

Что скажете?

ul9 23-10-2012 23:01 2011000

Всё поняла. Все файлы будут в UTF-8 без BOM.
«Найти это.txt» и «заменить этим.txt» тоже сохраню в нужной кодировке, так как они делаются руками. А вот файлы, в которых нужно работать, приходят в UTF-8 без BOM.
И я ещё хотела бы уточнить, возможен будет такой вариант, чтобы при пустом файле «заменить этим.txt» в файле «work.htm» просто удалялся фрагмент кода, заданный в «Найти это.txt»?

Iska 23-10-2012 23:06 2011006

Цитата:

Цитата ul9
Всё поняла. Все файлы будут в UTF-8 без BOM.
«Найти это.txt» и «заменить этим.txt» тоже сохраню в нужной кодировке, так как они делаются руками. А вот файлы, в которых нужно работать, приходят в UTF-8 без BOM. »

Ясно.

Цитата:

Цитата ul9
И я ещё хотела бы уточнить, возможен будет такой вариант, чтобы при пустом файле «заменить этим.txt» в файле «work.htm» просто удалялся фрагмент кода, заданный в «Найти это.txt»? »

Да.

Как осуществляем замену: переписываем содержимое файла новым содержимым (с произведённой заменой) поверх, без резервной копии, так?

ul9 23-10-2012 23:10 2011009

Цитата:

Цитата Iska
Как осуществляем замену: переписываем содержимое файла новым содержимым (с произведённой заменой) поверх, без резервной копии, так? »

В резервной копии нет необходимости. Меняем безоговорочно и безвозвратно :)

Iska 23-10-2012 23:54 2011033

Ну, вот, в первом приближении:
читать дальше »
Код:

Option Explicit

Const ForReading  = 1
Const ForWriting  = 2


Dim objArgs
Dim objFSO
Dim objFile

Dim strWhatFind
Dim strReplaceBy

Dim strContent


Set objArgs = WScript.Arguments.Named

If objArgs.Count = 4 Then
        Set objFSO  = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objArgs.Exists("FolderForScan") Then
                If objArgs.Exists("FileExtension") Then
                        If objArgs.Exists("FileWhatFind") Then
                                If objArgs.Exists("FileReplaceBy") Then
                                        If objFSO.FolderExists(objArgs.Item("FolderForScan")) Then
                                                If objFSO.FileExists(objArgs.Item("FileWhatFind")) Then
                                                        If objFSO.FileExists(objArgs.Item("FileReplaceBy")) Then
                                                                If objFSO.GetFile(objArgs.Item("FileWhatFind")).Size > 0 Then
                                                                        With objFSO.OpenTextFile(objArgs.Item("FileWhatFind"), ForReading)
                                                                                strWhatFind = .ReadAll()
                                                                                .Close
                                                                        End With
                                                                       
                                                                        If objFSO.GetFile(objArgs.Item("FileReplaceBy")).Size > 0 Then
                                                                                With objFSO.OpenTextFile(objArgs.Item("FileReplaceBy"), ForReading)
                                                                                        strReplaceBy = .ReadAll()
                                                                                        .Close
                                                                                End With
                                                                        Else
                                                                                strReplaceBy = ""
                                                                        End If
                                                                       
                                                                        WScript.Echo "Folder for scan: " & objArgs.Item("FolderForScan")
                                                                        WScript.Echo "File extension:  " & objArgs.Item("FileExtension")
                                                                        WScript.Echo "File what find:  " & objArgs.Item("FileWhatFind")
                                                                        WScript.Echo "File replace by: " & objArgs.Item("FileReplaceBy")
                                                                        WScript.Echo
                                                                       
                                                                        ScanSubFolders objFSO.GetFolder(objArgs.Item("FolderForScan"))
                                                                Else
                                                                        WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] is zero length"
                                                                End If
                                                        Else
                                                                WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                                                        End If
                                                Else
                                                        WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                                                End If
                                        Else
                                                WScript.Echo "Folder [" & objArgs.Item("FolderForScan") & "] not found"
                                        End If
                                Else
                                        WScript.Echo "Not found argument <FileReplaceBy>"
                                        Call Usage
                                End If
                        Else
                                WScript.Echo "Not found argument <FileWhatFind>"
                                Call Usage
                        End If
                Else
                        WScript.Echo "Not found argument <FileExtension>"
                        Call Usage
                End If
        Else
                WScript.Echo "Not found argument <FolderForScan>"
                Call Usage
        End If
       
        Set objFSO = Nothing
Else
        Call Usage
End If

Set objArgs = Nothing

WScript.Quit
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
        Dim objSubFolder
        Dim objFile
       
        WScript.Echo "[" & objFolder.Path & "]"
       
        For Each objFile In objFolder.Files
                If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objArgs.Item("FileExtension")) Then
                        WScript.Echo "  " & objFile.Name
                       
                        If objFile.Size > 0 Then
                                With objFSO.OpenTextFile(objFile.Path, ForReading)
                                        strContent = .ReadAll()
                                        .Close
                                End With
                               
                                If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
                                        WScript.Echo "    Fragment for replace found"
                                       
                                        With objFSO.OpenTextFile(objFile.Path, ForWriting)
                                                .Write Replace(strContent, strWhatFind, strReplaceBy)
                                                .Close
                                        End With
                                End If
                        End If
                End If
        Next
       
        WScript.Echo
       
        For Each objSubFolder In objFolder.SubFolders
                ScanSubFolders objSubFolder
        Next
End Sub
'=============================================================================

'=============================================================================
Sub Usage()
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
                "/FolderForScan:<folder> " & _
                "/FileExtension:<extension> " & _
                "/FileWhatFind:<file> " & _
                "/FileReplaceBy:<file>"
End Sub
'=============================================================================


ul9 24-10-2012 00:05 2011036

Спасибо Вам. А как его использовать? Приведите пожалуйста пример.
Код:

Sub Usage()
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
                "/FolderForScan:<folder> " & _
                "/FileExtension:<extension> " & _
                "/FileWhatFind:<file> " & _
                "/FileReplaceBy:<file>"
End Sub


Iska 24-10-2012 00:41 2011052

Цитата:

Цитата ul9
А как его использовать? »

Если его запустить — он напишет, как:
Код:

cscript.exe //nologo Script.vbs /FolderForScan:<folder> /FileExtension:<extension> /FileWhatFind:<file> /FileReplaceBy:<file>
Цитата:

Цитата ul9
Приведите пожалуйста пример. »

Пример:
Код:

cscript.exe //nologo "c:\My Scripts\Script.vbs" /FolderForScan:"E:\Песочница\0192" /FileExtension:"htm" /FileWhatFind:"E:\Песочница\0191\Найти это.txt" /FileReplaceBy:"E:\Песочница\0191\заменить этим.txt"
Естественно, для текущего каталога указывать пути не обязательно, равно как и заключать пути в кавычки, если в них нет пробельных символов. Если Вы не используете что-либо наподобие Far Manager'а — проще всего вписать это в пакетный файл.

ul9 24-10-2012 01:09 2011073

А он почему-то в подпапках не ищет... Может я что-то не так делаю.

Всё, разобралась. Причина была в путях. Всё работает отлично. Большое спасибо!

ul9 26-10-2012 05:18 2012360

Iska, очень уж ваш скрипт хорош и удобен!
Я хотела бы ещё спросить у вас. Возможно ли задать условие для запуска нужного кода?
Код:

cscript.exe //nologo "c:\My Scripts\Script.vbs" /FolderForScan:"E:\Песочница\0192" /FileExtension:"htm" /FileWhatFind:"E:\Песочница\0191\Найти это.txt" /FileReplaceBy:"E:\Песочница\0191\заменить этим.txt"
Запускаем скрипт и появляется msgbox с кнопками 1, 2, 3
В зависимости от того, какую нажали происходит выполнение нужного куска кода.
Код:

if 1
cscript.exe //nologo "c:\My Scripts\Script.vbs" /FolderForScan:"E:\Песочница\0001" /FileExtension:"htm" /FileWhatFind:"E:\Песочница\01\Найти это.txt" /FileReplaceBy:"E:\Песочница\01\заменить этим.txt"

if 2
cscript.exe //nologo "c:\My Scripts\Script.vbs" /FolderForScan:"E:\Песочница\0002" /FileExtension:"htm" /FileWhatFind:"E:\Песочница\02\Найти это.txt" /FileReplaceBy:"E:\Песочница\02\заменить этим.txt"

if 3
cscript.exe //nologo "c:\My Scripts\Script.vbs" /FolderForScan:"E:\Песочница\0003" /FileExtension:"htm" /FileWhatFind:"E:\Песочница\03\Найти это.txt" /FileReplaceBy:"E:\Песочница\03\заменить этим.txt"

Конечно можно создать три батника и запускать каждый, в зависимости от нужды. Но может есть более элегантное решение :)

Iska 26-10-2012 07:14 2012374

Цитата:

Цитата ul9
Конечно можно создать три батника и запускать каждый, в зависимости от нужды. Но может есть более элегантное решение »

Это вполне нормальное решение для повторного использования кода. Аналогичного результата можно добиться создав три ярлыка с соответствующей командной строкой в каждом.

ul9 26-10-2012 15:18 2012667

Цитата:

Цитата Iska
Это вполне нормальное решение для повторного использования кода. Аналогичного результата можно добиться создав три ярлыка с соответствующей командной строкой в каждом. »

На самом деле их значительно больше (около 15). Не хотелось бы на рабочем столе выстраивать их все в ряд :)

Iska 26-10-2012 17:30 2012762

Создайте папку на Рабочем столе, в Главном меню, создайте панель на Панели задач. Туда и поместите ярлыки или пакетные файлы.

ul9 26-10-2012 19:42 2012828

А через msgBox условие возможно реализовать или там только yes и no?

Iska 26-10-2012 20:47 2012872

Цитата:

Цитата ul9
А через msgBox условие возможно реализовать или там только yes и no? »

Доступно максимум три кнопки, коллега.

ul9 26-10-2012 21:00 2012882

Цитата:

Цитата Iska
Доступно максимум три кнопки, коллега. »

А если в cmd вывести?

echo 1 - green
echo 2 - red
и т.д.

Вводишь число и запускается скрипт. Я бы сама написала, но как эти условия задать без понятия, да ещё и связать с кнопками. Имею только общие представления по аналогии с яваскриптом.

Iska 26-10-2012 21:12 2012892

ul9, я никак не пойму, почему Вы так упорно хотите получить три действия (запуск + выбор + ввод) вместо двух (выбор + запуск)? Зачем?

ul9 26-10-2012 21:17 2012899

Потому что я свожу всё в один батник. Запустила ярлык и пошёл процесс. Только попутно выбираешь нужные действия. Делать 15 ярлыков совсем не вариант...

Iska 26-10-2012 21:20 2012904

Ну, тогда, раз Вам знаком JScript, напишите себе форму на HTA, в которой уже и будете выбирать, с какими параметрами запускать скрипт.

ul9 26-10-2012 21:38 2012932

Нашла вот таких два батника. Теперь осталось определиться.
Код:

@Echo Off

set /p variable=[Viberite tip 1- red 2- green 3- blue 4- black]
if /I %variable%==1 goto red
if /I %variable%==2 goto green
if /I %variable%==3 goto blue
if /I %variable%==4 goto black
goto error

:red
echo ****************************************************
echo red
echo ****************************************************
pause
:green
echo ****************************************************
echo green
echo ****************************************************
pause
:blue
echo ****************************************************
echo blue
echo ****************************************************
pause
:black
echo ****************************************************
echo black
echo ****************************************************
pause

:error
echo error - try again
pause
goto :start

Код:

@Echo off
 
:m1
Echo Выберите программу:
Echo.
Echo 1 - Программа 1
Echo 2 - Программа 2
Echo 3 - Программа 3
 
echo.
Set /p choice="Ваш выбор: "
if not defined choice goto m1
if "%choice%"=="1" (start 1.exe)
if "%choice%"=="2" (start 2.exe)
if "%choice%"=="3" (start 3.exe)
Echo.
Echo Не правильно сделан выбор задания
Echo.
Echo.
goto m1
pause >nul


Iska 26-10-2012 22:50 2012988

Цитата:

Цитата ul9
Теперь осталось определиться. »

Примерный вид исполнителя с кнопками на .hta:
читать дальше »
Код:

<html id="appSampleScriptRunner">
        <head>
                <meta charset="windows-1251">
                <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
                <meta http-equiv="Content-Language" content="ru">
                <title>Sample Script Runner</title>
                <hta:Application
                        Id              = "appSampleScriptRunner"
                        Icon            = "%SystemRoot%\System32\wscript.exe"
                        ApplicationName = "Sample Script Runner"
                        Border          = "normal"
                        BorderStyle    = "normal"
                        Caption        = "yes"
                        ContextMenu    = "no"
                        InnerBorder    = "yes"
                        MaximizeButton  = "yes"
                        MinimizeButton  = "yes"
                        Navigable      = "no"
                        Scroll          = "auto"
                        ScrollFlat      = "no"
                        Selection      = "no"
                        ShowInTaskbar  = "yes"
                        SingleInstance  = "yes"
                        SysMenu        = "yes"
                        Version        = "1.0"
                        WindowState    = "normal"
                />
               
                <style type="text/css">
                        body {
                                font: x-small Verdana, Arial, sans-serif;
                                color: WindowText;
                                background-color: ButtonFace;
                        }
                </style>
               
                <script language="VBScript">
                        Option Explicit
                       
                        Sub Window_OnLoad
                                Dim arrValues
                                Dim elem
                               
                                Dim objHTMLElement
                               
                                arrValues = Array( _
                                        "/FolderForScan:""E:\Песочница\0001"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\01\Найти это.txt"" /FileReplaceBy:""E:\Песочница\01\заменить этим.txt""", _
                                        "/FolderForScan:""E:\Песочница\0002"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\02\Найти это.txt"" /FileReplaceBy:""E:\Песочница\02\заменить этим.txt""", _
                                        "/FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt""" _
                                )
                               
                                For Each elem In arrValues
                                        Set objHTMLElement = document.createElement("input")
                                       
                                        With objHTMLElement
                                                .type            = "button"
                                                .style.textAlign = "left"
                                                .value          = "cscript.exe //nologo ""c:\My Scripts\Script.vbs""" & Replace(" " & elem, " /", vbCrLf & vbTab & " /")
                                               
                                                .onclick        = GetRef("OnClickButtonRunScript")
                                        End With
                                       
                                        document.body.appendChild objHTMLElement
                                       
                                        Set objHTMLElement = document.createElement("br")
                                        document.body.appendChild objHTMLElement
                                Next
                               
                                With window
                                        .resizeTo tagBody.scrollWidth + 25, tagBody.scrollHeight + 32
                                        .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
                                End With
                        End Sub
                       
                        Sub OnClickButtonRunScript()
                                With CreateObject("WScript.Shell")
                                        MsgBox Replace(window.event.srcElement.value, vbCrLf & vbTab & " /", " /")
                                        '.Run Replace(window.event.srcElement.value, vbCrLf & vbTab & " /", " /")
                                End With
                        End Sub
                </script>
        </head>
       
        <body id="tagBody" scroll="auto">
        </body>
       
        <script language="VBScript">
                Option Explicit
               
        </script>
</html>


ul9 26-10-2012 23:09 2012999

Цитата:

Цитата Iska
Примерный вид исполнителя с кнопками на .hta: »

Ого, а как это использовать? Первый раз такое вижу :)

Iska 26-10-2012 23:22 2013010

Откройте Блокнот. Скопируйте код и вставьте его в Блокнот. Сохраните в файл с расширением «.hta». Сделайте двойной щелчок в Проводнике по созданному файлу.

ul9 26-10-2012 23:30 2013015

Получилось.
Редактировать только тут?
Код:

Dim objHTMLElement       
arrValues = Array( _
        "/FolderForScan:""E:\Песочница\0001"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\01\Найти это.txt"" /FileReplaceBy:""E:\Песочница\01\заменить этим.txt""", _
        "/FolderForScan:""E:\Песочница\0002"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\02\Найти это.txt"" /FileReplaceBy:""E:\Песочница\02\заменить этим.txt""", _
        "/FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt""" _
)

А можно выводить не пути, а названия в кнопках(Красный, Зелёный и т.д.)?

А ещё лучше не названия, а просто пустые цветные кнопки (#00FF00, #FFFFFF...)

Iska 27-10-2012 01:22 2013049

Цитата:

Цитата ul9
Редактировать только тут… »

Да.

Цитата:

Цитата ul9
А можно выводить не пути, а названия в кнопках(Красный, Зелёный и т.д.)? »

Для данного алгоритма — нет. Тут название фактически является командной строкой для исполнения. Но можно сменить алгоритм.

Цитата:

Цитата ul9
А ещё лучше не названия, а просто пустые цветные кнопки (#00FF00, #FFFFFF...) »

Пробуйте другой алгоритм:
читать дальше »
Код:

<html id="appSampleScriptRunner">
        <head>
                <meta charset="windows-1251">
                <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
                <meta http-equiv="Content-Language" content="ru">
                <title>Sample Script Runner</title>
                <hta:Application
                        Id              = "appSampleScriptRunner"
                        Icon            = "%SystemRoot%\System32\wscript.exe"
                        ApplicationName = "Sample Script Runner"
                        Border          = "normal"
                        BorderStyle    = "normal"
                        Caption        = "yes"
                        ContextMenu    = "no"
                        InnerBorder    = "yes"
                        MaximizeButton  = "yes"
                        MinimizeButton  = "yes"
                        Navigable      = "no"
                        Scroll          = "auto"
                        ScrollFlat      = "no"
                        Selection      = "no"
                        ShowInTaskbar  = "yes"
                        SingleInstance  = "yes"
                        SysMenu        = "yes"
                        Version        = "1.1"
                        WindowState    = "normal"
                />
               
                <style type="text/css">
                        body {
                                font: x-small Verdana, Arial, sans-serif;
                                color: WindowText;
                                background-color: ButtonFace;
                        }
                </style>
               
                <script language="VBScript">
                        Option Explicit
                       
                        Dim objDictionary
                       
                        '==========================================================================
                        Sub Window_OnLoad
                                Dim strKey
                                Dim objHTMLElement
                               
                                For Each strKey In objDictionary.Keys
                                        Set objHTMLElement = document.createElement("div")
                                       
                                        With objHTMLElement
                                                .id    = strKey
                                                .title = Replace(objDictionary.Item(strKey), " /", vbCrLf & "  /")
                                               
                                                With .style
                                                        .textAlign      = "left"
                                                       
                                                        .borderWidth    = "thick"
                                                        .borderStyle    = "outset"
                                                       
                                                        .margin          = "0.5em"
                                                        .padding        = "0.5em"
                                                       
                                                        .backgroundColor = strKey
                                                End With
                                               
                                                .onclick    = GetRef("OnClickButtonRunScript")
                                               
                                                .onMouseOut  = GetRef("OnMouseOut")
                                                .onMouseOver = GetRef("OnMouseOver")
                                        End With
                                       
                                        document.body.appendChild objHTMLElement
                                       
                                        objHTMLElement.appendChild document.createTextNode(objDictionary.Item(strKey))
                                Next
                               
                                With window
                                        .resizeTo tagBody.scrollWidth + 25, tagBody.scrollHeight + 32
                                        .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
                                End With
                        End Sub
                        '==========================================================================
                       
                        '==========================================================================
                        Sub OnClickButtonRunScript()
                                With CreateObject("WScript.Shell")
                                        MsgBox objDictionary.Item(window.event.srcElement.id)
                                        '.Run objDictionary.Item(window.event.srcElement.id)
                                End With
                        End Sub
                        '==========================================================================
                       
                        '==========================================================================
                        Sub OnMouseOut()
                                With window.event.srcElement
                                        .style.color  = "WindowText"
                                End With
                        End Sub
                        '==========================================================================
                       
                        '==========================================================================
                        Sub OnMouseOver()
                                With window.event.srcElement
                                        .style.color  = "Yellow"
                                End With
                        End Sub
                        '==========================================================================
                       
                        Set objDictionary = CreateObject("Scripting.Dictionary")
                       
                        With objDictionary
                                .Add "Red",          "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0001"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\01\Найти это.txt"" /FileReplaceBy:""E:\Песочница\01\заменить этим.txt"""
                                .Add "Green",        "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0002"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\02\Найти это.txt"" /FileReplaceBy:""E:\Песочница\02\заменить этим.txt"""
                                .Add "Blue",          "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt"""
                                .Add "SpringGreen",  "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt"""
                                .Add "DarkSlateBlue", "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt"""
                                .Add "#CFCFF0",      "cscript.exe //nologo ""c:\My Scripts\Script.vbs"" /FolderForScan:""E:\Песочница\0003"" /FileExtension:""htm"" /FileWhatFind:""E:\Песочница\03\Найти это.txt"" /FileReplaceBy:""E:\Песочница\03\заменить этим.txt"""
                        End With
                </script>
        </head>
       
        <body id="tagBody" scroll="auto">
        </body>
</html>


Как и в предыдущем, для исполнения — закомментировать «MsgBox»:
Код:

                                        MsgBox objDictionary.Item(window.event.srcElement.id)
и раскомментировать «.Run»:
Код:

                                        '.Run objDictionary.Item(window.event.srcElement.id)

ul9 27-10-2012 01:43 2013055

Ага, спасибо. Мы уже почти приблизились к моей затее :)

Вот так бы было просто замечательно

Iska 27-10-2012 02:02 2013059

ul9, Вы Windows 8, случайно, не пробовали?

Объясните, как Вы планируете ориентироваться, какую кнопку нажимать — по памяти?

ul9 27-10-2012 02:09 2013061

Цитата:

Цитата Iska
Объясните, как Вы планируете ориентироваться, какую кнопку нажимать — по памяти? »

По цвету:) Наполнение одинаковое, но дизайн разный. В зависимости от цвета и выбирается скрипт. Поэтому не составит труда сориентироваться.
Цитата:

Цитата Iska
ul9, Вы Windows 8, случайно, не пробовали? »

Не пробовала. Более того и windows7 и windows vista тоже не пробовала, я до сих пор сижу на XP:) Специфика используемых программ не позволяет перейти на другую windows.

Iska 27-10-2012 05:26 2013078

Цитата:

Цитата ul9
Не пробовала. »

Странно. Было очень похоже на то.

Ладно. Пробуйте так:
читать дальше »
Код:

<html id="appSampleScriptRunner">
        <head>
                <meta charset="windows-1251">
                <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
                <meta http-equiv="Content-Language" content="ru">
                <title>Sample Script Runner</title>
                <hta:Application
                        Id              = "appTextReplacer"
                        Icon            = "%SystemRoot%\System32\wscript.exe"
                        ApplicationName = "Sample Script Runner"
                        Border          = "normal"
                        BorderStyle    = "normal"
                        Caption        = "yes"
                        ContextMenu    = "no"
                        InnerBorder    = "yes"
                        MaximizeButton  = "yes"
                        MinimizeButton  = "yes"
                        Navigable      = "no"
                        Scroll          = "auto"
                        ScrollFlat      = "no"
                        Selection      = "no"
                        ShowInTaskbar  = "yes"
                        SingleInstance  = "yes"
                        SysMenu        = "yes"
                        Version        = "1.1"
                        WindowState    = "normal"
                />
               
                <style type="text/css">
                        body {
                                font: x-small Verdana, Arial, sans-serif;
                                color: WindowText;
                                background-color: ButtonFace;
                        }
                </style>
               
                <script language="VBScript">
                        Option Explicit
                       
                        '==========================================================================
                        Sub Window_OnLoad
                                Dim strKey
                               
                                Dim objHTMLElement_Outer
                                Dim objHTMLElement
                               
                                Dim lngColumns
                                Dim lngColumn
                               
                                Dim elem
                               
                                If objFSO.FileExists(strIniFile) Then
                                        lngColumns = Int(Sqr(objDictionary.Count) + 1)
                                        lngColumn = 1
                                       
                                        For Each strKey In objDictionary.Keys
                                                If lngColumn = 1 Then
                                                        Set objHTMLElement_Outer = document.createElement("div")
                                                End If
                                               
                                                Set objHTMLElement = document.createElement("div")
                                               
                                                With objHTMLElement
                                                        .id    = strKey
                                                       
                                                        For Each elem In Array("FolderForScan", "FileExtension", "FileWhatFind", "FileReplaceBy")
                                                                .title = .title & elem & ": " & vbTab & objDictionary.Item(strKey).Item(elem) & vbCrLf
                                                        Next
                                                       
                                                        With .style
                                                                .display    = "inline"
                                                               
                                                                .width      = window.screen.availWidth  \  8
                                                                .height      = window.screen.availHeight \ 12
                                                               
                                                                .borderWidth = "thick"
                                                                .borderStyle = "outset"
                                                               
                                                                .margin      = "0.5em"
                                                                .padding    = "0.5em"
                                                               
                                                                .backgroundColor = strKey
                                                        End With
                                                       
                                                        .onclick    = GetRef("OnClickButtonRunScript")
                                                End With
                                               
                                                objHTMLElement_Outer.appendChild objHTMLElement
                                               
                                                If lngColumn = lngColumns Then
                                                        document.body.appendChild objHTMLElement_Outer
                                                       
                                                        lngColumn = 1
                                                Else
                                                        lngColumn = lngColumn + 1
                                                End If
                                        Next
                                       
                                        document.body.appendChild objHTMLElement_Outer
                                       
                                        Set objHTMLElement = document.createElement("textarea")
                                       
                                        With objHTMLElement
                                                .id            = "ProcessLog"
                                                .rows          = "25"
                                                .cols          = "80"
                                                .readOnly      = "true"
                                                .style.display = "none"
                                        End With
                                       
                                        document.body.appendChild objHTMLElement
                                       
                                        With window
                                                .resizeTo document.body.scrollWidth + 25, document.body.scrollHeight + 32
                                                .moveTo (.screen.availWidth - document.body.offsetWidth) \ 2, (.screen.availHeight - document.body.offsetHeight) \ 2
                                        End With
                                End If
                        End Sub
                        '==========================================================================
                       
                        '==========================================================================
                        Sub OnClickButtonRunScript()
                                document.getElementById("ProcessLog").value = _
                                        "Folder for scan: " & vbTab & objDictionary.Item(window.event.srcElement.id).Item("FolderForScan") & vbCrLf & _
                                        "File extension:  " & vbTab & objDictionary.Item(window.event.srcElement.id).Item("FileExtension") & vbCrLf & _
                                        "File what find:  " & vbTab & objDictionary.Item(window.event.srcElement.id).Item("FileWhatFind") & vbCrLf & _
                                        "File replace by: " & vbTab & objDictionary.Item(window.event.srcElement.id).Item("FileReplaceBy") & vbCrLf & vbCrLf
                               
                                With objFSO.OpenTextFile(objDictionary.Item(window.event.srcElement.id).Item("FileWhatFind"), ForReading)
                                        strWhatFind = .ReadAll()
                                        .Close
                                End With
                               
                                If objFSO.GetFile(objDictionary.Item(window.event.srcElement.id).Item("FileReplaceBy")).Size > 0 Then
                                        With objFSO.OpenTextFile(objDictionary.Item(window.event.srcElement.id).Item("FileReplaceBy"), ForReading)
                                                strReplaceBy = .ReadAll()
                                                .Close
                                        End With
                                Else
                                        strReplaceBy = ""
                                End If
                               
                                document.getElementById("ProcessLog").style.display = "block"
                               
                                With window
                                        .resizeTo document.body.scrollWidth + 25, document.body.scrollHeight + 32
                                        .moveTo (.screen.availWidth - document.body.offsetWidth) \ 2, (.screen.availHeight - document.body.offsetHeight) \ 2
                                End With
                               
                                ScanSubFolders objFSO.GetFolder(objDictionary.Item(window.event.srcElement.id).Item("FolderForScan"))
                        End Sub
                        '==========================================================================
                       
                        '==========================================================================
                        Sub ScanSubFolders(objFolder)
                                Dim objSubFolder
                                Dim objFile
                               
                                Dim strContent
                               
                                document.getElementById("ProcessLog").value = document.getElementById("ProcessLog").value & "[" & objFolder.Path & "]" & vbCrLf
                               
                                For Each objFile In objFolder.Files
                                        If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objDictionary.Item(window.event.srcElement.id).Item("FileExtension")) Then
                                                document.getElementById("ProcessLog").value = document.getElementById("ProcessLog").value & "  " & objFile.Name & vbCrLf
                                               
                                                If objFile.Size > 0 Then
                                                        With objFSO.OpenTextFile(objFile.Path, ForReading)
                                                                strContent = .ReadAll()
                                                                .Close
                                                        End With
                                                       
                                                        If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
                                                                document.getElementById("ProcessLog").value = document.getElementById("ProcessLog").value & "    Fragment for replace found" & vbCrLf
                                                               
                                                                With objFSO.OpenTextFile(objFile.Path, ForWriting)
                                                                        .Write Replace(strContent, strWhatFind, strReplaceBy)
                                                                        .Close
                                                                End With
                                                        End If
                                                End If
                                        End If
                                Next
                               
                                For Each objSubFolder In objFolder.SubFolders
                                        ScanSubFolders objSubFolder
                                Next
                        End Sub
                        '=============================================================================
                       
                        Const ForReading  = 1
                        Const ForWriting  = 2
                       
                       
                        Dim objDictionary
                        Dim objFSO
                       
                        Dim strIniFile
                       
                        Dim strLine
                        Dim strKey
                       
                        Dim strWhatFind
                        Dim strReplaceBy
                       
                       
                        Set objDictionary = CreateObject("Scripting.Dictionary")
                        Set objFSO        = CreateObject("Scripting.Filesystemobject")
                       
                        With objFSO
                                strIniFile = .BuildPath(.GetParentFolderName(Replace(appTextReplacer.commandLine, """", "")), .GetBaseName(appTextReplacer.commandLine) & ".ini")
                               
                                If .FileExists(strIniFile) Then
                                        With .OpenTextFile(strIniFile, ForReading)
                                                Do Until .AtEndOfStream
                                                        strLine = Trim(.ReadLine())
                                                       
                                                        If Len(strLine) > 0 Then
                                                                If Left(strLine, 1) = "[" And Right(strLine, 1) = "]" Then
                                                                        strKey = Mid(strLine, 2, Len(strLine) - 2)
                                                                        objDictionary.Add strKey, CreateObject("Scripting.Dictionary")
                                                                Else
                                                                        objDictionary.Item(strKey).Add Trim(Split(strLine, "=")(0)), Trim(Split(strLine, "=")(1))
                                                                End If
                                                        End If
                                                Loop
                                               
                                                .Close
                                        End With
                                Else
                                        MsgBox "Ini file [" & strIniFile & "] not found"
                                       
                                        window.close
                                End If
                        End With
                </script>
        </head>
       
        <body scroll="auto">
        </body>
</html>


Скрипт больше не нужен. Но понадобится ini-файл настроек, одноимённый hta-файлу. Выглядеть он может примерно так:
читать дальше »
Код:

[Red]
FolderForScan=E:\Песочница\0191\0001
FileExtension=htm
FileWhatFind=E:\Песочница\0191\Найти это2.txt
FileReplaceBy=E:\Песочница\0191\заменить этим2.txt

[Green]
FolderForScan=E:\Песочница\0002
FileExtension=htm
FileWhatFind=E:\Песочница\02\Найти это.txt
FileReplaceBy=E:\Песочница\02\заменить этим.txt

[Blue]
FolderForScan=E:\Песочница\0003
FileExtension=htm
FileWhatFind=E:\Песочница\03\Найти это.txt
FileReplaceBy=E:\Песочница\03\заменить этим.txt

[SpringGreen]
FolderForScan=E:\Песочница\0003
FileExtension=htm
FileWhatFind=E:\Песочница\03\Найти это.txt
FileReplaceBy=E:\Песочница\03\заменить этим.txt

[DarkSlateBlue]
FolderForScan=E:\Песочница\0003
FileExtension=htm
FileWhatFind=E:\Песочница\03\Найти это.txt
FileReplaceBy=E:\Песочница\03\заменить этим.txt

[#CFCFF0]
FolderForScan=E:\Песочница\0003
FileExtension=htm
FileWhatFind=E:\Песочница\03\Найти это.txt
FileReplaceBy=E:\Песочница\03\заменить этим.txt

[GreenYellow]
FolderForScan=E:\Песочница\0003
FileExtension=htm
FileWhatFind=E:\Песочница\03\Найти это.txt
FileReplaceBy=E:\Песочница\03\заменить этим.txt



Скорее всего, ошибок будет куча.

ul9 27-10-2012 17:33 2013289

Цитата:

Цитата Iska
Скорее всего, ошибок будет куча. »

Спасибо, у меня всё работает без ошибок. ProcessLog и кнопки я заузила, а вот как сделать уже окно что-то не пойму?


Iska 27-10-2012 17:52 2013307

ul9, я не представляю как сие сделать для IE6.

ul9 27-10-2012 18:13 2013323

Цитата:

Цитата Iska
ul9, я не представляю как сие сделать для IE6. »

А у меня установлен IE8 :)
Версия: 8.0.6001.18702

Iska 27-10-2012 19:26 2013356

Цитата:

Цитата ul9
А у меня установлен IE8
Версия: 8.0.6001.18702 »

А у меня — нет ;).

ul9 27-10-2012 19:38 2013367

Если я правильно поняла, то происходит запуск окна браузера и в нём уже появляются эти кнопки. Нашла вот такую команду
Код:

window.resizeTo(500,220)
Только как её применить?

Iska 27-10-2012 19:49 2013372

Цитата:

Цитата ul9
Только как её применить? »

Найдите в *.hta следующий код:
Код:

                                        With window
                                                .resizeTo document.body.scrollWidth + 25, document.body.scrollHeight + 32
                                                .moveTo (.screen.availWidth - document.body.offsetWidth) \ 2, (.screen.availHeight - document.body.offsetHeight) \ 2
                                        End With

и вставьте «.resizeTo(500,220)» отдельной строкой перед «End With». Но это не есть правильно — жёстко задавать размеры при плавающем содержимом.

ul9 27-10-2012 19:59 2013373

Чего-то ошибку пишет:
"Недопустимо использование скобок при вызове процедуры Sub"

Iska 27-10-2012 20:59 2013400

Цитата:

Цитата ul9
Чего-то ошибку пишет:
"Недопустимо использование скобок при вызове процедуры Sub" »

Я, к сожалению, не обратил внимания на приведённый Вами синтаксис. Вставляйте такое:
Код:

.resizeTo 500, 220

ul9 27-10-2012 22:03 2013445

Теперь без ошибки, но размер окна не меняет.:)
Ладно, буду так использовать. Большое Вам спасибо за помощь!

Iska 27-10-2012 22:50 2013473

Цитата:

Цитата ul9
но размер окна не меняет. »

Меняет. Только что проверил. Возможно, Вы нашли не все места, где встречается указанный код, и вставили только в процедуру обработки. Ищите все места.

ul9 27-10-2012 23:43 2013501

Точно, надо было во всех местах расставить. А может есть какое-нибудь унивирсальное значение для высоты, чтобы не фиксировало?

Iska 28-10-2012 00:11 2013519

ul9, для высоты как раз вполне работает тот код, который есть.

ul9 28-10-2012 00:27 2013528

Цитата:

Цитата Iska
ul9, для высоты как раз вполне работает тот код, который есть. »

Для высоты. Но ещё есть и ширина, которая занимает почти весь экран.

Iska 28-10-2012 04:01 2013575

Цитата:

Цитата ul9
Но ещё есть и ширина, которая занимает почти весь экран. »

Ага. Есть. Но я уже сказал, что приемлемых способов не знаю, а IE8 у меня не установлен. Поспрашивайте, у кого есть. Может быть, вообще переделают под Ваш конкретный случай.


Время: 21:43.

Время: 21:43.
© OSzone.net 2001-