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

4zz 26-03-2019 23:06 2865284

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

alpap 27-03-2019 00:16 2865296

Код:

>"Текстовый файл.txt" echo Произвольное количество каких-то там [1,2,5,$,#], знаков
не все знаки удастся вывести таким образом
Цитата:

Цитата 4zz
вопрос при запуске - "введите количество символов" »

set /p /?

megaloman 27-03-2019 00:33 2865302

4zz,
Цитата:

Цитата alpap
не все знаки удастся вывести таким образом »

Плюс
Цитата:

Цитата 4zz
количество символов в батник (допустим 592283), »

такую длинную строку в CMD обработать не удастся.
Поэтому, сакраментальный вопрос: зачем это нужно и почему CMD, а не, допустим, vbs?
Какие символы при этом допустимы?

yurfed 27-03-2019 02:02 2865308

megaloman, не силён в написании скриптов, но рандомный вариант может быть использован, отключив неиспользуемые символы.
Только я не представляю зачем это нужно :)
Очередной BALON?

megaloman 27-03-2019 16:05 2865368

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 2865373

Минимум изменений, но экономия по времени 20-25%.
Отличие - в способе извлечения символа из набора
Код:

@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

В обоих кодах запись в файл ведётся квантами. Почему-то считал, чем больше квант, тем быстрее работа скрипта. Оказалось, не так однозначно. Буферизация? Но, в любом случае, генерация случайного набора занимает много больше времени.

4zz 27-03-2019 19:14 2865409

megaloman,
Спасибо!
Все работает!))
Это нужно для файла в котором должно быть определенное количество символов, в разное время)

Iska 27-03-2019 22:57 2865470

Цитата:

Цитата megaloman
Буферизация? »

Скорее всего.

4zz 27-03-2019 23:21 2865474

Работает, но очень долго..(
А может это можно ускорить копированием -вставкой?
Или из готового текстового файла посчитать количество символов и оставить необходимое, остальное удалить?

Iska 27-03-2019 23:39 2865477

4zz, а может Вы подумаете про переход на WSH/PoSH вместо пакетных файлов?

megaloman 28-03-2019 01:37 2865494

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 знаков и затем их повторить нужное число раз. Это радикально ускорит работу.

Iska 28-03-2019 03:29 2865501

Код:

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 2865515

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 "Скрипт завершен"

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

Iska 28-03-2019 10:17 2865519

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())

Примерный итог:

4zz 28-03-2019 10:26 2865522

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

megaloman 28-03-2019 10:26 2865523

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

4zz 28-03-2019 11:06 2865531

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

Iska 28-03-2019 11:33 2865534

Цитата:

Цитата megaloman
Как подсчитать оптимум? »

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

Цитата:

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

В моём варианте — пока никак.

4zz 28-03-2019 11:52 2865540

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

megaloman 28-03-2019 12:10 2865543

Цитата:

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

Iska,
Цитата:

Цитата Iska
Я тупо брал и циклически наращивал размер строки »

У меня
Код:

Символы        Секунды
64        3,6
128        3,5
256        3,4
512        3,3
1024        3,4
2048        3,7
4096        5,2


4zz 28-03-2019 12:52 2865552

megaloman,
СПАСИБО!!! ВСЕ РАБОТАЕТ!)

Iska 28-03-2019 13:11 2865559

Цитата:

Цитата megaloman
Байты »

Тут, наверное, всё-таки символы — внутри себя WSH хранит строки в виде Юникода.


Время: 06:40.

Время: 06:40.
© OSzone.net 2001-