Показать полную графическую версию : [решено] рэндом
Подскажите, нужно написать скрипт, который бы рэндомно вставлял в текстовый файл одну из 3 заданых строк
Что именно вызывает затруднения — «рэндомно … одну из 3 заданых строк» или «вставлял в текстовый файл»? Первое решается примерно так:
Dim arrString
arrString = Array("Мама", "мыла", "раму")
Randomize Timer
WScript.Echo arrString(Int(Rnd * 3))
Второе же не решаемо в принципе, поскольку WSH не умеет «вставлять в файл», а только писать в файл с нуля, либо дополнять файл. Обходится это чтением всего содержимого файла (целиком или по частям), обработкой и последующей записью. В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки».
тогда немного уточню, нужно дописать в уже существующий файл одну из 3 строк, но в определённое место
пример :
нужно найти в тексте слово "мама" и рэндомно заменить на одно из трех "мама", "мыла" или "раму"
Перечитайте выделенное:
В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки». »
имя, кодировка и путь к файлу известно, нужно найти в .txt слово "мама" и рэндомно заменить на одно из трех "мама", "мыла" или "раму"
имя, кодировка и путь к файлу известно, »
Спасибо, кэп. Я как бы в курсе того, что они известны Вам. Но не мне. И если имя и путь не существенны для конечного вида кода, то от кодировки зависит, как именно он будет выглядеть.
Мне-то что, я сделаю по наиболее простому варианту, а если у Вас из-за кодировки не отработает (или концы строк окажутся не CrLf (DOS/Windows), а, скажем, Cr (Mac), або Lf (Unix)) — это же не проблема, я ведь добрая фея, и здесь только для того, чтобы выполнять Ваши желания, переделаю раз, другой, третий — по первому Вашему требованию.
Пробуйте:
Option Explicit
Dim strSourceFile
Dim strContent
Dim objRegExp
If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = "мама"
End With
If objRegExp.Test(strContent) Then
.CopyFile strSourceFile, .GetBaseName(strSourceFile) & ".bak" ,True
Randomize Timer
With .CreateTextFile(strSourceFile, True)
.Write objRegExp.Replace(strContent, Array("Мама", "мыла", "раму")(Int(Rnd * 3)))
.Close
End With
Else
WScript.Echo "Pattern [" & objRegExp.Pattern & "] not found in content of source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Set objRegExp = Nothing
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If
WScript.Quit 0
Сохраните код в файл с расширением .vbs. Путь к исходному файлу задаётся параметром скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике). Копия исходного файла будет сохранена с расширением .bak (при этом существующий файл .bak, если он есть, будет молча перезаписан).
сори, имел ввиду, что в скрипте можете любой путь вставить, я потом поменяю на нужный, кодировка юникод
кодировка юникод »
Ну, вот. О чём, собственно, и речь.
Пробуйте так:
Option Explicit
Const ForReading = 1
Const TristateTrue = -1
Dim strSourceFile
Dim strContent
Dim objRegExp
If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile, ForReading, False, TristateTrue)
strContent = .ReadAll()
.Close
End With
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = "мама"
End With
If objRegExp.Test(strContent) Then
.CopyFile strSourceFile, .GetBaseName(strSourceFile) & ".bak" ,True
Randomize Timer
With .CreateTextFile(strSourceFile, True, True)
.Write objRegExp.Replace(strContent, Array("Мама", "мыла", "раму")(Int(Rnd * 3)))
.Close
End With
Else
WScript.Echo "Pattern [" & objRegExp.Pattern & "] not found in content of source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Set objRegExp = Nothing
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If
WScript.Quit 0
если воспользоваться перетаскиванием файла, то ошибка "Pattern [мама] not found in content of source file [E:\1.txt].
Тогда упаковывайте Ваш файл E:\1.txt в архив и прикладывайте к сообщению (если архив не помещается — тогда на RGhost или Яндекс.Диск). Будем смотреть. Подозреваю, что там не просто юникод, а какой-нибудь UTF-8 для полного счастья.
null999, ну и с чего Вы решили, что Config.txt — юникод? Или, может, это я Вас так «запугал»?! Берите код из сообщения #6 (http://forum.oszone.net/post-2679297.html#post2679297).
P.S. Выбранный Вами способ — неудачен.
подскажите еще, где добавить путь к файлу
подскажите еще, где добавить путь к файлу »
Здесь:
Путь к исходному файлу задаётся параметром скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике). »
Dim strSourceFile
strSourceFile = "E:\1.txt"
так?
null999, можете и так. Только закомментируйте/уберите тогда проверку на наличие параметра скрипта и его последующее присвоение переменной strSourceFile.
Например, так (не проверялось):
Option Explicit
Dim strSourceFile
Dim strContent
Dim objRegExp
strSourceFile = "E:\1.txt"
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With
Set objRegExp = WScript.CreateObject("VBScript.RegExp")
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = "мама"
End With
If objRegExp.Test(strContent) Then
.CopyFile strSourceFile, .GetBaseName(strSourceFile) & ".bak" ,True
Randomize Timer
With .CreateTextFile(strSourceFile, True)
.Write objRegExp.Replace(strContent, Array("Мама", "мыла", "раму")(Int(Rnd * 3)))
.Close
End With
Else
WScript.Echo "Pattern [" & objRegExp.Pattern & "] not found in content of source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Set objRegExp = Nothing
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
End With
WScript.Quit 0
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.