Компьютерный форум 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=150722)

Possessed 16-09-2009 20:27 1220490

Нужно быстро (!) добавить/удалить строку во все файлы указанной директории
 
Нужно быстро (!) добавить/удалить строку во все файлы указанной (жестко- в тексте самого скрипта) директории и всех поддиректорий.
Строка должна быть добавлена в начало файла. Файлы текстовые, но имеющие отличное от txt расширение.

amel27 18-09-2009 11:07 1221683

Цитата:

Цитата Possessed
Строка должна быть добавлена в начало файла »

а как тогда насчет "удалить"?..

Possessed 19-09-2009 07:33 1222278

1) Добавить нужную строку в начало файла
2) Произвести некоторые действия с целевым файлом (это уже не средствами бат файла )
2) Удалить добавленную в шаге один строку из начала файла

То есть - нужны два батника, один из которых добавляет, а второй удаляет нужную строку.

gora 19-09-2009 22:13 1222804

Цитата:

Цитата Possessed
Добавить нужную строку в начало файла »

Код:

Echo Текст добавляемой строки > temp.txt
rem добавляем ее в начало файла test.txt и результат записываем в Out.txt
Copy /A temp.txt + /A test.txt /A Out.txt

Если в шаге 3 нужен файл идентичный исходному, то его проще сохранить (переименовав, например), а затем восстановить.

megaloman 20-09-2009 01:20 1222943

Вот решение проблемы с помощью VBS - скрипта. Копируйте приведенный код в блокнот, сохраните в файл с расширением vbs, например, InsAndDel_xxx.vbs, запускайте как любой исполнимый файл.
Скрипт может вставить строку в указанное место, удалить указанную строку.

В скрипте надо прописать Ваши: Директорию
Текст вставляемой строки
Номер новой строки после вставки в текст
Номер удаляемой строки

Если номер вставляемой строки = номеру удаляемой, то строка заменяется

Вы можете сохранить скрипт с разными настройками под разными именами и последовательно их запускать.
Код:

' Позволяет 1) Добавить строку в указанную строку всех текстовых файлов директории и поддиректорий
'          2) Удалить указанную по счету строку в текстовых файлах директории и поддиректорий
' Предполагается, что, кроме текстовых файлов, в директориях иных файлов нет


'  Исходные данные  -------------------------------------------------------
iDir = "D:\Всякая дребедень"            ' Директория где обрабатываем файлы

inStrok = "Добавляемая строка 1"        ' Текст добавляемой новой строки
NinStrok = 1                            ' Номер строки в файлах, куда вставим новую строку (если <=0 (или номер строки в файле за его пределами) то не вставляем)

NoutStrok = 1                          ' Номер удаляемой строки в исходном файле (если <=0 (или номер строки в файле за его пределами) то не удаляем)
' -------------------------------------------------------------------------

Call AllFolders(iDir, inStrok, NinStrok, NoutStrok)

' *************************************************************************

Sub AllFolders(iiDir, iinStrok, iNinStrok, iNoutStrok)      ' ---------------------------------------------

Call Ins_Del(iiDir, iinStrok, iNinStrok, iNoutStrok)

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set F = FSO.GetFolder(iiDir)

If Err.Number = 0 Then

    Set SubF = F.SubFolders

    For Each Folder In SubF
        Call AllFolders(iiDir + "\" + Folder.Name, iinStrok, iNinStrok, iNoutStrok)
    Next

Else
    a = MsgBox(iiDir + Chr(13) + Chr(10) + Err.Description, 0, "Неудачное открытие папки")
End If

End Sub

Sub Ins_Del(iiDir, iinStrok, iNinStrok, iNoutStrok)      ' ---------------------------------------------

Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.GetFolder(iiDir)
Set Files = F.Files

For Each ff In Files
'    a = MsgBox(iiDir + "\" + ff.Name)

    Set tFile = FSO.OpenTextFile(iiDir + "\" + ff.Name, 1)
    inText = tFile.ReadAll()
    inText = Replace(inText, Chr(10), "")
    Mass = Split(Replace(inText, Chr(10), ""), Chr(13))
    inText = ""
    tFile.Close
   
    iBeg = LBound(Mass)
    iEnd = UBound(Mass)
'    a = MsgBox(iiDir + "\" + ff.Name + "  " + CStr(iBeg) + "  " + CStr(iEnd))
   
    Set tFile = FSO.OpenTextFile(iiDir + "\" + ff.Name, 2)
    For i = iBeg To iEnd
        If i + 1 = iNinStrok Then
            If i <> iEnd Then
                tFile.WriteLine iinStrok
            Else
                tFile.Write iinStrok
            End If
        End If
   
        If i + 1 <> iNoutStrok Then
            If i <> iEnd Then
                tFile.WriteLine Mass(i)
            Else
                tFile.Write Mass(i)
            End If
        End If
    Next
    tFile.Close

   
Next

End Sub

Если вместо куска кода от начала до строки с ******* вставить
Код:

' Позволяет 1) Добавить строку в указанную строку всех текстовых файлов директории и поддиректорий
'          2) Удалить указанную по счету строку в текстовых файлах директории и поддиректорий
' Предполагается, что кроме текстовых файлов в директориях нет


'  Аргументы -------------------------------------------------------------------------------------

'  inStrok        ' Текст добавляемой новой строки
'  NinStrok        ' Номер строки в файлах, куда вставим новую строку (если <=0 (или номер строки в файле за его пределами) то не вставляем)

'  NoutStrok      ' Номер удаляемой строки в исходном файле (если <=0 (или номер строки в файле за его пределами) то не удаляем)


'  Исходные данные  ------------------------------------------------------------------------------
iDir = "D:\Всякая дребедень"            ' Директория где обрабатываем файлы
' ------------------------------------------------------------------------------------------------

Set Arg = WScript.Arguments

if Arg.Count = 3 Then

        inStrok = Arg(0)   
        NinStrok =  Arg(1)*1   
        NoutStrok = Arg(2)*1 


        Call AllFolders(iDir, inStrok, NinStrok, NoutStrok)
Else
            a = MsgBox("Количество аргументов должно быть равно 3, а указано " + CStr(Arg.Count))
End If

и сохранить, например, под именем InsAndDel.vbs
то Ваша задача сведётся к вызову скрипта с разным набором параметров

Вставим в начало строку
InsAndDel.vbs "У попа была собака" 1 0

Удалим первую строку
InsAndDel.vbs "" 0 1

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

Подозреваю, что то, что Вы делаете с файлами между вставкой-удалением строк можно тоже проделать в скрипте.

Birdimson 04-10-2011 15:43 1765681

А у меня не много другая задача, нужно вставить строки в определенные разделы, не поможете?
Нужно вставить в раздел [EntryKey] еще одну строчку Item99=, а в [Router2] Item99=xxx например, впрочем можно просто повторить скрипт для каждого раздела.

[EntryKey]
Item1=
Item2=
Item3=
Item4=

[Router2]
Item1=
Item2=
Item3=
Item4=

Iska 04-10-2011 22:29 1766051

Birdimson, если у Вас именно INI-файл, то надёжнее и проще всего использовать методы «.Ini*()» объекта AutoItX.


Время: 14:19.

Время: 14:19.
© OSzone.net 2001-