Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] рэндом

Ответить
Настройки темы
VBS/WSH/JS - [решено] рэндом

Пользователь


Сообщения: 56
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:32, 17-10-2016

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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


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

Randomize Timer

WScript.Echo arrString(Int(Rnd * 3))
Второе же не решаемо в принципе, поскольку WSH не умеет «вставлять в файл», а только писать в файл с нуля, либо дополнять файл. Обходится это чтением всего содержимого файла (целиком или по частям), обработкой и последующей записью. В любом случае требуется знать имя и путь к файлу, его кодировку и принцип, по которому будет определяться место «вставки».
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:04, 17-10-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 56
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:17, 17-10-2016 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:26, 17-10-2016 | #4


Пользователь


Сообщения: 56
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось null999, 17-10-2016 в 22:51.


Отправлено: 22:42, 17-10-2016 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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, если он есть, будет молча перезаписан).

Отправлено: 09:56, 18-10-2016 | #6


Пользователь


Сообщения: 56
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось null999, 18-10-2016 в 10:51.


Отправлено: 10:36, 18-10-2016 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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

Отправлено: 11:12, 18-10-2016 | #8


Пользователь


Сообщения: 56
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:39, 18-10-2016 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:55, 18-10-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] рэндом

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход