Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Создание текстового файла с набором символов
4zz 4zz вне форума

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


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

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


Уважаемые знатоки!
Помогите создать батник при запуске которого создавался бы текстовый файл с указанным количеством произвольных символов (буквы, цифры, знаки).
Варианты - либо я вношу количество символов в батник (допустим 592283), либо вопрос при запуске - "введите количество символов".
Спасибо заранее!))

Отправлено: 23:06, 26-03-2019

 

Ветеран


Contributor


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

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


VBS. Если в имени файла русские буквы - сохранить в 1251 кодировке
Код: Выделить весь код
NMax = 56789
OutFile = "Z:\Box_Out\полная фигня.txt"

N1 = 32
N2 = 127
NS = N2 - N1

ReDim S(NS)

For i = 0 To NS
    S(i) = Chr(i + N1)
Next

NS1 = NS + 1
SS = ""

Randomize
For i = 1 To NMax
    SS = SS + S(Int(NS1 * Rnd))
Next

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
    .Write SS
    .Close
End With


MsgBox Len(SS)
Вся последовательность генерируется. Работает, на вскидку, на порядок-два быстрее (не анализировал с цифрами) CMD. Но сотни символов - всё равно медленно.
Набор символов можно взять с кодами от 0 до 255. (N1 и N2).
Если можно
Цитата 4zz:
А может это можно ускорить копированием -вставкой? »
, то возможно сгенерировать, допустим, 50000 знаков и затем их повторить нужное число раз. Это радикально ускорит работу.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-03-2019 в 01:43.


Отправлено: 01:37, 28-03-2019 | #11



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

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


Ветеран


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

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


Код: Выделить весь код
Option Explicit

Dim dtNow

Dim strSourceFile
Dim iCount
Dim i, j
Dim sValue


dtNow = Now()

strSourceFile = "C:\Мои проекты\0254\полная фигня 2.txt"
iCount = 2^10

Randomize Timer

With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(strSourceFile, True)
	For i = 1 To iCount
		sValue = ""
		
		For j = 1 To iCount
			sValue = sValue & Chr(Int(96 * Rnd()) + 32)
		Next
		
		.Write sValue
	Next
	
	.Close
End With

WScript.Echo DateDiff("s", dtNow, Now())

WScript.Quit 0
Если мне не изменяет память — максимальный размер строки должен вертеться в интервале примерно от 512 до 4096 (хотя мог уже и запамятовать, а ещё раз тестировать лень).
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:29, 28-03-2019 | #12


Ветеран


Contributor


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

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


Iska, И всё-таки она вертится! Впечатлился скоростью работы Вашего скрипта. Ранее перед записью в файл я формировал всю строку целиком, затем скидывал в файл. ~500000 символов формировалось долго.
Вот vbs-вариант, в котором все символы генерируются случайным образом, но запись на диск ведётся квантами по 1024 знака как у Вас, а не целиком.
Отрабатывает за считанные секунды на моём допотопном ноуте
Код: Выделить весь код
NMax = 543210
OutFile = "Z:\Box_Out\полная фигня 543210.txt"

N1 = 0
N2 = 255

Quant = 1024

NS = N2 - N1

ReDim S(NS)

For i = 0 To NS
    S(i) = Chr(i + N1)
Next

NS1 = NS + 1
SS = ""

Randomize

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
	j = 0
	For i = 1 To NMax
		j = j + 1
    		SS = SS + S(Int(NS1 * Rnd))
		If j = Quant Then
			j = 0
			.Write SS
			SS = ""
		End If
	Next

    	If j > 0 Then .Write SS
    	.Close
End With

MsgBox "Скрипт завершен"
Похоже, можно пооптимизировать размер кванта, но пока это за пределами моего трудолюбия.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-03-2019 в 10:19.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:54, 28-03-2019 | #13


Ветеран


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

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


50000 — многовато, начинают сказываться издержки на конкатенацию строк.

Для примера

0004.vbs:
Код: Выделить весь код
Option Explicit

Dim dtNow

Dim strSourceFile
Dim iCount
Dim i, j
Dim sValue


dtNow = Now()

strSourceFile = "C:\Мои проекты\0254\полная фигня 2.txt"
iCount = 2^15

Randomize Timer

With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile(strSourceFile, True)
	For i = 1 To iCount
		sValue = ""

		For j = 1 To 2^10 ' Всего — 2^25, 32Мб выйдет
			sValue = sValue & Chr(Int(96 * Rnd()) + 32)
		Next

		.Write sValue
	Next

	.Close
End With

WScript.Echo DateDiff("s", dtNow, Now())

WScript.Quit 0
и 0005.vbs:
Код: Выделить весь код
dtNow = Now()

NMax = 2^25
OutFile = "C:\Мои проекты\0254\полная фигня 543210.txt"

N1 = 0
N2 = 255

Quant = 50000

NS = N2 - N1

ReDim S(NS)

For i = 0 To NS
    S(i) = Chr(i + N1)
Next

NS1 = NS + 1
SS = ""

Randomize

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
	j = 0
	For i = 1 To NMax
		j = j + 1
    		SS = SS + S(Int(NS1 * Rnd))
		If j = Quant Then
			j = 0
			.Write SS
			SS = ""
		End If
	Next

    	If j > 0 Then .Write SS
    	.Close
End With

'MsgBox "Скрипт завершен"
WScript.Echo DateDiff("s", dtNow, Now())
Примерный итог:
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:17, 28-03-2019 | #14

4zz 4zz вне форума Автор темы

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


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

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


megaloman, Iska,
Спасибо!!! )

Отправлено: 10:26, 28-03-2019 | #15


Ветеран


Contributor


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

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


Iska, Уже понял и исправил. Как подсчитать оптимум?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 10:26, 28-03-2019 | #16

4zz 4zz вне форума Автор темы

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


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

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


Извиняюсь.., а как прописать избранные и исключенные символы?

Отправлено: 11:06, 28-03-2019 | #17


Ветеран


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

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


Цитата megaloman:
Как подсчитать оптимум? »
Я тупо брал и циклически наращивал размер строки степенями двойки то ли с 64, то ли со 128 символов до то ли 32 Kb, то ли до 64 Kb, и писал некий, достаточно большой объём в файл. И подсчитывал время (всё это, разумеется, в одном скрипте, дабы не вручную). Точную цифру я уже не помню, но оптимум находился где-то в промежутке 512-4096 символов. Если вдруг найдётся время — попробую повторить.

Цитата 4zz:
а как прописать избранные и исключенные символы? »
В моём варианте — пока никак.

Отправлено: 11:33, 28-03-2019 | #18

4zz 4zz вне форума Автор темы

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


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

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


megaloman,
В cmd я пытался регулировать в Вашем варианте:
rem не использовать ^%&|<>"()'=
Set "Symb=+1234567890-QWERTYUIOPqwertyuiopASDFGHJKLasdfghjklZXCVBNM?zxcvbnm"

Отправлено: 11:52, 28-03-2019 | #19


Ветеран


Contributor


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

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


Цитата 4zz:
а как прописать избранные и исключенные символы? »
Задавайте литерал с символами сами внутри кавычек. Кавычка " прописывается в литерале удвоением ""
Код: Выделить весь код
NMax = 5432109
OutFile = "Z:\Box_Out\полная фигня 5432109.txt"

AllChr = "~!@#$%^&*()_+QWERTYUIOP{}ASDFGHJKL:""|ZXCVBNM<>?`1234567890-=qwertyuiop[]asdfghjkl;'\zxcvbnm,./ "

Quant = 1024

N1 = 1
N2 = Len(AllChr)
NS = N2 - N1

ReDim S(NS)

For i = 0 To NS
    S(i) = Mid(AllChr, i + 1, 1)
Next

NS1 = NS + 1
SS = ""

Randomize

Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(OutFile, True)
    j = 0
    For i = 1 To NMax
        j = j + 1
            SS = SS + S(Int(NS1 * Rnd))
        If j = Quant Then
            j = 0
            .Write SS
            SS = ""
        End If
    Next

        If j > 0 Then .Write SS
        .Close
End With

MsgBox "Скрипт завершен"
rem не использовать ^%&|<>"()'=
в CMD не есть задание исключений, это комментарий для моей/Вашей памяти
В vbs неприятностей с этими знаками нет, в строке можно задать с клавиатуры все символы.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-03-2019 в 12:20.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:10, 28-03-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Проблема ч набором символов speed8@vk Ноутбуки 3 08-09-2014 16:17
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла icomboy Скриптовые языки администрирования Windows 0 10-09-2013 15:17
CMD/BAT - [решено] Создание текстового файла с последовательными числами указанного диапазона 91892823 Скриптовые языки администрирования Windows 2 03-08-2012 06:43
CMD/BAT - чтение такстового файла и создание текстового с частичным содержанием прочтеного вайл Anufriev Скриптовые языки администрирования Windows 1 28-06-2012 11:52
CMD/BAT - [решено] Создание текстового файла при условии его отсутствия в папке spilberg Скриптовые языки администрирования Windows 1 12-07-2009 15:58




 
Переход