Показать полную графическую версию : [решено] Создание текстового файла с набором символов
Уважаемые знатоки!
Помогите создать батник при запуске которого создавался бы текстовый файл с указанным количеством произвольных символов (буквы, цифры, знаки).
Варианты - либо я вношу количество символов в батник (допустим 592283), либо вопрос при запуске - "введите количество символов".
Спасибо заранее!))
>"Текстовый файл.txt" echo Произвольное количество каких-то там [1,2,5,$,#], знаков
не все знаки удастся вывести таким образом
вопрос при запуске - "введите количество символов" »
set /p /?
megaloman
27-03-2019, 00:33
4zz, не все знаки удастся вывести таким образом »Плюсколичество символов в батник (допустим 592283), »такую длинную строку в CMD обработать не удастся.
Поэтому, сакраментальный вопрос: зачем это нужно и почему CMD, а не, допустим, vbs?
Какие символы при этом допустимы?
megaloman, не силён в написании скриптов, но рандомный вариант может быть использован, отключив неиспользуемые символы.
Только я не представляю зачем это нужно :)
Очередной BALON (http://old-dos.ru/index.php?page=files&mode=files&do=show&id=3126)?
megaloman
27-03-2019, 16:05
4zz, @Echo Off
cls
Set "Out=Z:\Box_Out\полная фигня.txt"
Set /A Max=8765
rem не использовать ^%&|<>"()'=
Set "Symb=~!#$*_+1234567890-QWERTYUIOP{}qwertyuiop[]ASDFGHJKL:asdfghjkl;\ZXCVBNM?zxcvbnm,./ Ё№ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю"
Set /A NS=-1 &FOR /L %%i IN (0,1,255) DO (Call :Substr %%i "S" &&Set /A NS+=1)
Set "Str="
Set /A N=0
Set /A M=0
Set /A Quant=4000
2>nul Del "%Out%"
:Begin
Set /A N+=1
Set /A M+=1
Set /A K=(%NS%+1)*%Random%/32768
Call :Substr %K% "S"
Set "Str=%Str%%S%"
If %N% EQU %Quant% (
Echo DownLoad %M%
<Nul Set /P "S=%Str%">>"%Out%"
Set "Str="
Set "S="
Set /A N=0
)
If %M% NEQ %Max% GoTo :Begin
If %N% NEQ 0 <Nul (Echo DownLoad %M% &Set /P S=%Str%>>"%Out%")
Pause
GoTo :Eof
:Substr
Call Set "@S=%%Symb:~%1,1%%"
Set "%~2=%@S%"
If "%@S%"=="" Exit /B 1
Exit /B 0Длина файла скриптом не ограничивается, весь вопрос - а сколько времени займёт, допустим, генерирование и запись строки из нескольких сот тысяч символов.
megaloman
27-03-2019, 16:47
@Echo Off
cls
Set "Out=Z:\Box_Out\полная фигня.txt"
Set /A Max=8765
rem не использовать ^%&|<>"()'=
Set "Symb=~!#$*_+1234567890-QWERTYUIOP{}qwertyuiop[]ASDFGHJKL:asdfghjkl;\ZXCVBNM?zxcvbnm,./ Ё№ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю"
Set /A NS=-1 &FOR /L %%i IN (0,1,255) DO (Call :Substr %%i "S" &&(Set /A NS+=1 &Call Set "@@@%%NS%%=%%S%%"))
Set "Str="
Set /A N=0
Set /A M=0
Set /A Quant=4000
2>nul Del "%Out%"
:Begin
Set /A N+=1
Set /A M+=1
Set /A K=(%NS%+1)*%Random%/32768
Call Set "Str=%Str%%%@@@%K%%%"
If %N% EQU %Quant% (
Echo DownLoad %M%
<Nul Set /P "S=%Str%">>"%Out%"
Set "Str="
Set "S="
Set /A N=0
)
If %M% NEQ %Max% GoTo :Begin
If %N% NEQ 0 <Nul (Echo DownLoad %M% &Set /P S=%Str%>>"%Out%")
Pause
GoTo :Eof
:Substr
Call Set "@S=%%Symb:~%1,1%%"
Set "%~2=%@S%"
If "%@S%"=="" Exit /B 1
Exit /B 0В обоих кодах запись в файл ведётся квантами. Почему-то считал, чем больше квант, тем быстрее работа скрипта. Оказалось, не так однозначно. Буферизация? Но, в любом случае, генерация случайного набора занимает много больше времени.
megaloman,
Спасибо!
Все работает!))
Это нужно для файла в котором должно быть определенное количество символов, в разное время)
http://forum.oszone.net/moz-extension://14335473-2232-4a31-90f2-b79c0df59eee/informenter-marker.png
Буферизация? »
Скорее всего.
Работает, но очень долго..(
А может это можно ускорить копированием -вставкой?
Или из готового текстового файла посчитать количество символов и оставить необходимое, остальное удалить?
http://forum.oszone.net/moz-extension://14335473-2232-4a31-90f2-b79c0df59eee/informenter-marker.pnghttp://forum.oszone.net/moz-extension://14335473-2232-4a31-90f2-b79c0df59eee/informenter-marker.png
4zz, а может Вы подумаете про переход на WSH/PoSH вместо пакетных файлов?
megaloman
28-03-2019, 01:37
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).
Если можноА может это можно ускорить копированием -вставкой? », то возможно сгенерировать, допустим, 50000 знаков и затем их повторить нужное число раз. Это радикально ускорит работу.
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 (хотя мог уже и запамятовать, а ещё раз тестировать лень).
megaloman
28-03-2019, 09:54
Iska, И всё-таки она вертится! Впечатлился скоростью работы Вашего скрипта. Ранее перед записью в файл я формировал всю строку целиком, затем скидывал в файл. ~500000 символов формировалось долго. 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 "Скрипт завершен"
Похоже, можно пооптимизировать размер кванта, но пока это за пределами моего трудолюбия.
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())
Примерный итог:
https://i.imgur.com/UyHR2mb.png
megaloman, Iska,
Спасибо!!! )http://forum.oszone.net/moz-extension://14335473-2232-4a31-90f2-b79c0df59eee/informenter-marker.png
megaloman
28-03-2019, 10:26
Iska, Уже понял и исправил. Как подсчитать оптимум?
Извиняюсь.., а как прописать избранные и исключенные символы?
Как подсчитать оптимум? »
Я тупо брал и циклически наращивал размер строки степенями двойки то ли с 64, то ли со 128 символов до то ли 32 Kb, то ли до 64 Kb, и писал некий, достаточно большой объём в файл. И подсчитывал время (всё это, разумеется, в одном скрипте, дабы не вручную). Точную цифру я уже не помню, но оптимум находился где-то в промежутке 512-4096 символов. Если вдруг найдётся время — попробую повторить.
а как прописать избранные и исключенные символы? »
В моём варианте — пока никак.
megaloman,
В cmd я пытался регулировать в Вашем варианте:
rem не использовать ^%&|<>"()'=
Set "Symb=+1234567890-QWERTYUIOPqwertyuiopASDFGHJKLasdfghjklZXCVBNM?zxcvbnm"
megaloman
28-03-2019, 12:10
а как прописать избранные и исключенные символы? »
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 неприятностей с этими знаками нет, в строке можно задать с клавиатуры все символы.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.