PDA

Показать полную графическую версию : [решено] рэндом


null999
17-10-2016, 20:32
Подскажите, нужно написать скрипт, который бы рэндомно вставлял в текстовый файл одну из 3 заданых строк

Iska
17-10-2016, 21:04
Что именно вызывает затруднения — «рэндомно … одну из 3 заданых строк» или «вставлял в текстовый файл»? Первое решается примерно так:
Dim arrString


arrString = Array("Мама", "мыла", "раму")

Randomize Timer

WScript.Echo arrString(Int(Rnd * 3))

Второе же не решаемо в принципе, поскольку WSH не умеет «вставлять в файл», а только писать в файл с нуля, либо дополнять файл. Обходится это чтением всего содержимого файла (целиком или по частям), обработкой и последующей записью. В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки».

null999
17-10-2016, 21:17
тогда немного уточню, нужно дописать в уже существующий файл одну из 3 строк, но в определённое место
пример :
нужно найти в тексте слово "мама" и рэндомно заменить на одно из трех "мама", "мыла" или "раму"

Iska
17-10-2016, 22:26
Перечитайте выделенное:
В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки». »

null999
17-10-2016, 22:42
имя, кодировка и путь к файлу известно, нужно найти в .txt слово "мама" и рэндомно заменить на одно из трех "мама", "мыла" или "раму"

Iska
18-10-2016, 09:56
имя, кодировка и путь к файлу известно, »
Спасибо, кэп. Я как бы в курсе того, что они известны Вам. Но не мне. И если имя и путь не существенны для конечного вида кода, то от кодировки зависит, как именно он будет выглядеть.

Мне-то что, я сделаю по наиболее простому варианту, а если у Вас из-за кодировки не отработает (или концы строк окажутся не 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, если он есть, будет молча перезаписан).

null999
18-10-2016, 10:36
сори, имел ввиду, что в скрипте можете любой путь вставить, я потом поменяю на нужный, кодировка юникод

Iska
18-10-2016, 11:12
кодировка юникод »
Ну, вот. О чём, собственно, и речь.

Пробуйте так:
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

null999
18-10-2016, 11:39
если воспользоваться перетаскиванием файла, то ошибка "Pattern [мама] not found in content of source file [E:\1.txt].

Iska
18-10-2016, 11:55
Тогда упаковывайте Ваш файл E:\1.txt в архив и прикладывайте к сообщению (если архив не помещается — тогда на RGhost или Яндекс.Диск). Будем смотреть. Подозреваю, что там не просто юникод, а какой-нибудь UTF-8 для полного счастья.

null999
18-10-2016, 12:48
http://rgho.st/92GCYyr68

Iska
18-10-2016, 13:33
null999, ну и с чего Вы решили, что Config.txt — юникод? Или, может, это я Вас так «запугал»?! Берите код из сообщения #6 (http://forum.oszone.net/post-2679297.html#post2679297).

P.S. Выбранный Вами способ — неудачен.

null999
18-10-2016, 13:53
подскажите еще, где добавить путь к файлу

Iska
18-10-2016, 14:20
подскажите еще, где добавить путь к файлу »
Здесь:
Путь к исходному файлу задаётся параметром скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике). »

null999
18-10-2016, 14:51
Dim strSourceFile
strSourceFile = "E:\1.txt"
так?

Iska
18-10-2016, 15:18
null999, можете и так. Только закомментируйте/уберите тогда проверку на наличие параметра скрипта и его последующее присвоение переменной strSourceFile.

null999
18-10-2016, 15:30
как это сделать?

Iska
18-10-2016, 15:34
Например, так (не проверялось):
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

null999
18-10-2016, 15:51
все работает, спасибо




© OSzone.net 2001-2012