PDA

Показать полную графическую версию : Нужно быстро (!) добавить/удалить строку во все файлы указанной директории


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

amel27
18-09-2009, 11:07
Строка должна быть добавлена в начало файла »а как тогда насчет "удалить"?..

Possessed
19-09-2009, 07:33
1) Добавить нужную строку в начало файла
2) Произвести некоторые действия с целевым файлом (это уже не средствами бат файла )
2) Удалить добавленную в шаге один строку из начала файла

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

gora
19-09-2009, 22:13
Добавить нужную строку в начало файла »
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
Вот решение проблемы с помощью 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
А у меня не много другая задача, нужно вставить строки в определенные разделы, не поможете?
Нужно вставить в раздел [EntryKey] еще одну строчку Item99=, а в [Router2] Item99=xxx например, впрочем можно просто повторить скрипт для каждого раздела.

[EntryKey]
Item1=
Item2=
Item3=
Item4=

[Router2]
Item1=
Item2=
Item3=
Item4=

Iska
04-10-2011, 22:29
Birdimson, если у Вас именно INI-файл, то надёжнее и проще всего использовать методы «.Ini*()» объекта AutoItX (http://www.script-coding.com/AutiItX.html).




© OSzone.net 2001-2012