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

null999 17-10-2016 20:32 2679169

рэндом
 
Подскажите, нужно написать скрипт, который бы рэндомно вставлял в текстовый файл одну из 3 заданых строк

Iska 17-10-2016 21:04 2679177

Что именно вызывает затруднения — «рэндомно … одну из 3 заданых строк» или «вставлял в текстовый файл»? Первое решается примерно так:
Код:

Dim arrString


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

Randomize Timer

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

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

null999 17-10-2016 21:17 2679181

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

Iska 17-10-2016 22:26 2679193

Перечитайте выделенное:
Цитата:

Цитата Iska
В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки». »


null999 17-10-2016 22:42 2679199

имя, кодировка и путь к файлу известно, нужно найти в .txt слово "мама" и рэндомно заменить на одно из трех "мама", "мыла" или "раму"

Iska 18-10-2016 09:56 2679297

Цитата:

Цитата null999
имя, кодировка и путь к файлу известно, »

Спасибо, кэп. Я как бы в курсе того, что они известны Вам. Но не мне. И если имя и путь не существенны для конечного вида кода, то от кодировки зависит, как именно он будет выглядеть.

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

сори, имел ввиду, что в скрипте можете любой путь вставить, я потом поменяю на нужный, кодировка юникод

Iska 18-10-2016 11:12 2679321

Цитата:

Цитата null999
кодировка юникод »

Ну, вот. О чём, собственно, и речь.

Пробуйте так:
Скрытый текст
Код:

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 2679330

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

Iska 18-10-2016 11:55 2679333

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

null999 18-10-2016 12:48 2679350

Вложений: 1
http://rgho.st/92GCYyr68

Iska 18-10-2016 13:33 2679373

null999, ну и с чего Вы решили, что Config.txt — юникод? Или, может, это я Вас так «запугал»?! Берите код из сообщения #6.

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

null999 18-10-2016 13:53 2679381

подскажите еще, где добавить путь к файлу

Iska 18-10-2016 14:20 2679392

Цитата:

Цитата null999
подскажите еще, где добавить путь к файлу »

Здесь:
Цитата:

Цитата Iska
Путь к исходному файлу задаётся параметром скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике). »


null999 18-10-2016 14:51 2679401

Dim strSourceFile
strSourceFile = "E:\1.txt"
так?

Iska 18-10-2016 15:18 2679412

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

null999 18-10-2016 15:30 2679417

как это сделать?

Iska 18-10-2016 15:34 2679418

Например, так (не проверялось):
Скрытый текст
Код:

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 2679423

все работает, спасибо


Время: 10:26.

Время: 10:26.
© OSzone.net 2001-