Консультация № 148882
29.10.2008, 14:38
0.00 руб.
0 6 2
Здравствуйте, подскажите как написать скрипт (vbs) для следующих действий:
Указываем в скрипте каталог ( например: c:\test\ ), скрипт должен в этом каталоге и подкаталогах искать файлы (например test.txt), затем в этом файле заменять строку (напимер строка 3 с содержанием: teststroka1 = "1", "2") на test_stroka_234, сохраняет изменения в этом файле и ищет файлы с названием test.txt далее, находя файлы делает теже действия, после того как поиск закончн в данном каталоге и подкаталогах, скрипт завершает свою работу.

Обсуждение

давно
Модератор
137394
1850
29.10.2008, 18:00
общий
А какая вложенность подкаталогов? Есть каталог а в нём подкаталоги? Или у подкаталогов есть свои подкаталоги, а у тех, в свою очередь, еще свои ... и т д.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
29.10.2008, 19:25
общий
это ответ
Здравствуйте, Alexrub!
Думаю это решение Вашей задачи:
Код:
Dim FSO, WSH, TheExtension, sTxtFile
Dim TheFolder, Message, YesNo
Const sStartFolder = "C:\test" 'стартовый каталог
Const sFileName = "\test.txt" 'искомый файл
Const sFindTxt = "MAUG" 'искомый текст
Const sNewTxt = "New Text" 'заменяющий текст
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set TheFolder = FSO.GetFolder(sStartFolder) '
Message = "Текст стартового диалога Да/Нет ?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
WorkWithSubFolders TheFolder, sFileName, sFindTxt, sNewTxt
End If


Sub WorkWithSubFolders(ByVal AFolder, ByVal sFile, ByVal sFtxt, ByVal sNtxt)
Dim MoreFolders, TempFolder, sTempTxt
TempFolder = AFolder & sFile
sTempTxt = ReadAllTextFile(TempFolder)
sTempTxt = Replace(sTempTxt, sFtxt, sNtxt)
WriteAllTextFile TempFolder, sTempTxt
Set MoreFolders = AFolder.SubFolders
For Each TempFolder In MoreFolders
WorkWithSubFolders TempFolder, sFile, sFtxt, sNtxt
Next
End Sub
Function ReadAllTextFile(sFilePath)
Const ForReading = 1, ForWriting = 2
Dim FSO, ts
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.OpenTextFile(sFilePath, ForReading)
ReadAllTextFile = ts.ReadAll
End Function
Sub WriteAllTextFile(sFilePath, sFileTxt)
Dim FSO
Dim ts
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ts = FSO.OpenTextFile(sFilePath, 2, True)
ts.Write sFileTxt
ts.Close
End Sub

Евгений.
Неизвестный
30.10.2008, 06:49
общий
А какая вложенность подкаталогов? Есть каталог а в нём подкаталоги? Или у подкаталогов есть свои подкаталоги, а у тех, в свою очередь, еще свои ... и т д.

[b]У подкаталогов есть свои подкаталоги, а у тех, в свою очередь, еще свои[/b]
Неизвестный
30.10.2008, 09:57
общий
Евгений, огромнейшее спасибо за скрипт, ВСЁ работает !!!
Сори что в оценке написал, вам +10 баллов !!!
Неизвестный
30.10.2008, 10:13
общий
Не понятно почему, но если я ищу файл в каталоге c:\Documents and Settings\ скрипт его не находит, говорит что файл не найден
Подскажите почему такое происходит

И еще подскажите как в этот скрипт запинать вот такую штуку:
appdata=CreateObject("WScript.Shell").ExpandEnvironmentStrings("%appdata%")
put = appdata + "\test\test1"
т.е. что бы путь к файлу определялся параметром put
давно
Модератор
137394
1850
30.10.2008, 20:36
общий
это ответ
Здравствуйте, Alexrub!
В приложении предлагаю свой вариант решения, также можете загрузить готовый файл
Почему при наличии ответа Тесленко Евгений Алексеевич я всё же счел возможным дать еще один:
1. ИМХО приведенный скрипт Тесленко Евгений Алексеевич требует, чтобы в каждой директории находился файл с указанным именем. Если такого файла нет, скрипт сваливается в ошибку (скрипт его не находит, говорит что файл не найден )
2. Вы требовали, чтобы замена проводилась в конкретной строке. Тесленко Евгений Алексеевич сделал скрипт, который меняет подстроки во всём тексте, а не в указанной строке.
Задача показалась мне интересной с точки зрения обучения: обязан заметить - использование рекурсивного вызова подпрограммы подсмотрел у Тесленко Евгений Алексеевич.
Не понял Ваш вопрос в минифоруме: попробуйте его объяснить понятнее (не надо писать код, объясните подробнее словами), постараюсь помочь.


Приложение:
' Скрипт ищет в папке и во всех подпапках текстовый файл с указанным именем
' При его наличии в указанной строке заменяет указанный текст на новый

AllDir="F:\DDDDDD" ' --------- Полное имя рабочего каталога (без слэжа \ на конце)
NameText="txt.txt" ' --------- Искомый в каталогах текстовый файл
NumberLine=3 ' --------- В какой строке заменяем
OldText="teststroka1 = ""1"", ""2"")" ' --------- Что заменяем в указанной строке (каждая " в тексте должна быть указана как "")
NewText="test_stroka_234" ' --------- На что заменяем в указанной строке


Set FSO=WScript.CreateObject("Scripting.FileSystemObject")

outStr=""

Rezult=Remake(AllDir,NameText)
If Rezult<>"" Then outStr=OutStr & Rezult & Chr(13) & Chr(10)
AllFolders AllDir

Wscript.Echo outStr ' Выдача протокола поиска и обработки файлов (если не требуется, можно закомментировать или удалить)
' ---------------------------------------------------------------------------

Sub AllFolders(WDir)
' Wscript.Echo WDir

Set F=FSO.GetFolder(WDir)
Set SubF=F.SubFolders

For Each Folder in SubF
' Wscript.Echo Folder.Name

Rezult=Remake(WDir & "" & Folder.Name,NameText)
If Rezult<>"" Then outStr=OutStr & Rezult & Chr(13) & Chr(10)
AllFolders WDir & "" & Folder.Name
Next

End Sub

Function Remake(inPath,inText)

PathFile=inPath & "" & inText
' Wscript.Echo PathFile

On Error Resume Next

Set NumberFile=FSO.OpenTextFile(PathFile,1,false,0)
If Err.Number<>0 Then
Remake=""
Else
Remake= PathFile

AllText=NumberFile.ReadAll
NumberFile.Close

LF=Chr(10)

iBegin=1

For i=1 To NumberLine-1
iBegin=InStr(iBegin,AllText,LF)
If iBegin=0 Then Exit For
iBegin=iBegin+1
Next

If iBegin<>0 Then
iEnd=InStr(iBegin,AllText,LF)

If Len(OldText) <= iEnd-iBegin+1 Then

AllText1=Mid(AllText,1,iBegin-1)
AllText2=Mid(AllText,iBegin,iEnd-iBegin+1)
AllText=Mid(AllText,iEnd+1)

If InStr(1,AllText2,OldText) <> 0 Then Remake= PathFile & " -> Обработан"

AllText=AllText1 & Replace(AllText2,OldText,NewText) & AllText

Set NumberFile = FSO.OpenTextFile(PathFile, 2, false)
NumberFile.Write AllText
NumberFile.Close

End If

End If
End If

End Function
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа