![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Замена строки в файле строкой из другого файла - нужна помощь |
|
CMD/BAT - Замена строки в файле строкой из другого файла - нужна помощь
|
Новый участник Сообщения: 11 |
У меня есть bat
bat
@echo
setlocal enableextensions enabledelayedexpansion set sFile=1.txt set sTempFile=TempFile.tmp for /f "usebackq" %%i in (`type "%sFile%" ^| find.exe /c /v ""`) do set sLines=%%i set /a iLine = sLines * %Random% / 32768 more +%iLine% "%sFile%">"%sTempFile%" <"%sTempFile%" set /p sVar=>nul echo %sVar% >2.txt endlocal exit /b 0 Рандомно вытаскивает из файла 1.txt строку и копирует ее в новый файл 2.txt Помогите добавить в этот же bat команду, которая берет содержимое файла 2.txt (одно текст. слово длиной 5-12 символов на латинице) и заменяет им строку Sample123 в файле out.dat |
|
Отправлено: 03:59, 09-04-2022 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать Цитата dixxia:
В 1.txt каждая строка - это слово длиной 5-12 символов на латинице Рандомно выбирается строка из 1.txt (это слово 5-12 символов) и записывается в файл 2.txt В файле out.dat слово Sample123 заменяется словом записанным в 2.txt Для такой постановки (Ваш кусок переписал)
@Echo Off cls Set "File1=Z:\Box_In\1.txt" Set "FileOut=Z:\Box_In\2.txt" Set "FileRep=Z:\Box_In\out.dat" Set "Rep=Sample123" Set /A N=0 For /f "usebackq Skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find.exe /V /N "" "%File1%"`) Do Call Set R=%%Random%% &If Not "%%j"=="" Set /A N=%%i Set /A R=%N%*%Random%/32768 For /f "usebackq delims=" %%i In (`2^>nul More +%R% "%File1%"`) Do ( Set "RR=%%i" >"%FileOut%" (Echo %%i) GoTo :Cont ) :Cont FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find /V /N "" "%FileRep%"`) DO ( Set Str=.%%j Set /A Num=100000000+%%i Call Set "@3@%%Num%%=%%Str:%Rep%=%RR%%%" ) >"%FileRep%" (FOR /F "usebackq tokens=2 delims==" %%i In (`2^>nul Set "@3@"`) DO Echo%%i) Pause Exit /B - в 1.txt строки с произвольными словами - в 2.txt надо записать одну из строк из 1.txt, в которой обязательно есть хотя бы одно слово длиной 5-12 символов на латинице - в файле out.dat слово Sample123 заменяется словом записанным в строке 2.txt, причем, если таких слов несколько, выбрать это слово случайным образом. При этом код в CMD получается более громоздким
@echo off cls Set "File1=Z:\Box_In\1.txt" Set "FileOut=Z:\Box_In\2.txt" Set "FileRep=Z:\Box_In\out.dat" Set "Rep=Sample123" Set "Reg1=/C:" [A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]* "" Set "Reg2=/C:"[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]"" Set "Reg3=/C:"^[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]*$"" If Not Exist "%File1%" (Echo File not found "%File1%" &Pause &Exit /B 2) >"%FileOut%" cd. || (Echo "%FileOut%" &Pause &Exit /B 2) If Not Exist "%FileRep%" (Echo File not found "%FileRep%" &Pause &Exit /B 2) Set "N=0" FOR /F "usebackq delims=" %%i In (`More "%File1%"`) DO ( (Echo %%i )|>nul FINDSTR /I /R %Reg1% && ( Set /A N+=1 Call Set "@1@%%N%%=%%i" ) ) If %N%==0 (Echo File not correct "%File1%"! &Pause &Exit /B 2) rem Set "@1@" Set R=%Random% Set /A K=0 :Begin Set /A R=1+%N%*%Random%/32768 Call Set "R=%%@1@%R%%%" Set /A M=0 For %%i In (%R%) Do ( Echo %%i|FINDSTR /V /I /R %Reg2%|>nul FINDSTR /I /R %Reg3% &&( Set /A M+=1 Call Set "@2@%%M%%=%%i" ) ) Set /A K+=1 If %M%==0 (If %K% GTR 20 (Echo File not correct!! "%File1%" &Pause &Exit /B 2)) If %M%==0 GoTo :Begin rem Set "@2@" Set /A RR=1+%M%*%Random%/32768 Call Set "RR=%%@2@%RR%%%" >"%FileOut%" (Echo %R%) rem Echo RR=%RR% FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find /V /N "" "%FileRep%"`) DO ( Set Str=.%%j Set /A Num=100000000+%%i Call Set "@3@%%Num%%=%%Str:%Rep%=%RR%%%" ) >"%FileRep%" (FOR /F "usebackq tokens=2 delims==" %%i In (`2^>nul Set "@3@"`) DO Echo%%i) Pause Exit /B |
|
------- Отправлено: 19:02, 09-04-2022 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать megaloman, первый вариант правильный - огромное Спасибо!!! Наконец-то мои мучения заканчиваются!!! заработало!!!
|
Последний раз редактировалось dixxia, 09-04-2022 в 23:28. Причина: добавлено точнее Отправлено: 21:26, 09-04-2022 | #3 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать megaloman, сначала неправильно скопировал ваш скрипт, не работало, проверил еще раз, все работает!!! в личку отправил вам сообщение.
|
Отправлено: 23:30, 09-04-2022 | #4 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать dixxia, Я еще оттестировал батник, убедился, что он работает. Но предполагается, что файлы текстовые. С бинарным файлом штатными утилитами вряд ли возможно. На всякий случай добавил в батник контроль наличия файлов.
@Echo Off cls Set "File1=1.txt" Set "FileOut=2.txt" Set "FileRep=out.dat" Set "Rep=Samp123" If Not Exist "%File1%" (Echo File not found "%File1%" &Pause &Exit /B 2) >"%FileOut%" cd. || (Echo "%FileOut%" &Pause &Exit /B 2) If Not Exist "%FileRep%" (Echo File not found "%FileRep%" &Pause &Exit /B 2) Set /A N=0 For /f "usebackq Skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find.exe /V /N "" "%File1%"`) Do Call Set R=%%Random%% &If Not "%%j"=="" Set /A N=%%i Set /A R=%N%*%Random%/32768 For /f "usebackq delims=" %%i In (`2^>nul More +%R% "%File1%"`) Do ( Set "RR=%%i" >"%FileOut%" (Echo %%i) GoTo :Cont ) :Cont FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i In (`2^>nul Find /V /N "" "%FileRep%"`) DO ( Set Str=.%%j Set /A Num=100000000+%%i Call Set "@3@%%Num%%=%%Str:%Rep%=%RR%%%" ) Set /A Num-=100000000 Echo This file contains %Num% lines: "%FileRep%" >"%FileRep%" (FOR /F "usebackq tokens=2 delims==" %%i In (`2^>nul Set "@3@"`) DO Echo%%i) Pause Exit /B |
|
------- Отправлено: 23:59, 09-04-2022 | #5 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать megaloman, проверил на файле, почему то минут 5 заняла эта операция, файл 100kb, а я такие bat-ы с разными значениями на один файл буду запускать штук 10 последовательно. Почти час. Печально очень. В HexEdit за пару минут меняю. Есть ли возможность убыстрить, может другими путями, может PowerShell быстрее будет? Во вложении конкретный файл, именно с такими мне нужно работать.
out.ggu это то, что я собирался подставлять вместо out.dat (текст samp123 почти в самом начале, встречается тольк один раз) 1.txt - это текстовой список не прикрепляет, наверно потому что недавно зарегистрировался на форуме |
Отправлено: 00:34, 10-04-2022 | #6 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать В sfk команда sfk replace -binary /3232323220536f6e/4444444444444444/ -force -dir out.dat меняет бинарные 32 32 32 32 20 53 6f 6e на 44 44 44 44 44 44 44 44 мгновенно, и текст так же. Копаюсь в документации, пытаюсь сделать аналог скрипта ув.megaloman, серого вещества не хватвет катастрофически....
|
Последний раз редактировалось dixxia, 10-04-2022 в 02:21. Отправлено: 02:08, 10-04-2022 | #7 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать dixxia, Вы задали вопрос в теме CMD, получили bat. Для обработки текста CMD подходит плохо. Вот для текстовых файлов vbs-скрипт исполняется мгновенно.
File1 = "Z:\Box_In\1.txt" FileOut = "Z:\Box_In\2.txt" FileRep = "Z:\Box_In\out.dat" Rep = "Samp123" Randomize With CreateObject("Scripting.FileSystemObject") On Error Resume Next Set fIn = .OpenTextFile(File1, 1, False) If Err.Number <> 0 Then MsgBox File1 + vbCr + vbCr + Err.Description, vbCritical WScript.Quit 2 End If MasSpis = Split(fIn.ReadAll, vbCrLf) If Err.Number <> 0 Then MsgBox File1 + vbCr + vbCr + Err.Description, vbCritical WScript.Quit 2 End If fIn.Close i1 = LBound(MasSpis) i2 = UBound(MasSpis) RepRnd = Trim(MasSpis(Int((i2 - i1 + 1) * Rnd + i1))) Erase MasSpis Set fIn = .OpenTextFile(FileOut, 2, True) If Err.Number <> 0 Then MsgBox FileOut + vbCr + vbCr + Err.Description, vbCritical WScript.Quit 2 End If fIn.Write RepRnd fIn.Close Set fIn = .OpenTextFile(FileRep, 1, False) If Err.Number <> 0 Then MsgBox FileRep + vbCr + vbCr + Err.Description, vbCritical WScript.Quit 2 End If OutRep = Replace(fIn.ReadAll, Rep, RepRnd) fIn.Close Set fIn = .OpenTextFile(FileRep, 2, True) If Err.Number <> 0 Then MsgBox FileRep + vbCr + vbCr + Err.Description, vbCritical WScript.Quit 2 End If OutRep = Replace(fIn.ReadAll, Rep, RepRnd) fIn.Write OutRep fIn.Close On Error GoTo 0 End With |
------- Отправлено: 14:32, 10-04-2022 | #8 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать megaloman, это моя ошибка, что сразу не уточнил, что меняю в бинарном файле. Я не в курсе был, что "Для обработки текста CMD подходит плохо", теперь буду знать. Спасибо!
|
Отправлено: 01:37, 12-04-2022 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Множественная замена текста в файлах текстом из другого файла | Delleter | Скриптовые языки администрирования Windows | 4 | 16-06-2017 05:16 | |
CMD/BAT - [решено] Замена текста одного файла, текстом из другого файла | ninjaman | Скриптовые языки администрирования Windows | 8 | 11-03-2017 00:59 | |
VBS/WSH/JS - [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox | ultrarare | Скриптовые языки администрирования Windows | 11 | 03-07-2013 14:37 | |
PowerShell - [решено] Замена строк из файла строками из файла в файле | bcubbs@fb | Скриптовые языки администрирования Windows | 6 | 24-01-2013 17:22 | |
VBS/WSH/JS - [решено] Замена текста из другого файла | ul9 | Скриптовые языки администрирования Windows | 46 | 28-10-2012 04:01 |
|