Показать полную графическую версию : [решено] Замена строк.
angel_lyucifer
20-02-2017, 02:00
Привет всем, есть файл config.xml в нём куча строк.
Мне нужно заменить строки
<AdvertPlaceholder>1</AdvertPlaceholder>
На
<AdvertPlaceholder>0</AdvertPlaceholder>
И
<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>
На
<AdvertEastRailsEnabled>0</AdvertEastRailsEnabled>
Я пытался создать скрипт но не получилось, попробуйте исправить мой скрипт пожалуйста...
setlocal EnableDelayedExpansion
set filename=%AppData%\Skype\%SLOGIN%\config.xml :Это путь к файлу.
set $filename=%TEMP%\new.txt
for /f "tokens=1* delims=]" %%A in ('find /v /n "" ^<"%filename%"') do (set line=%%B
if "!line!"=="<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>" (echo ^<AdvertEastRailsEnabled^>0^<^/AdvertEastRailsEnabled^>>>%$filename%) else (echo.!line!>>%$filename%))
del /q %filename%
ren "%$filename%" "%filename%"
for /f "tokens=1* delims=]" %%A in ('find /v /n "" ^<"%filename%"') do (set line=%%B
if "!line!"=="<AdvertPlaceholder>1</AdvertPlaceholder>" (echo ^<AdvertPlaceholder^>0^<^/AdvertPlaceholder^>>>%$filename%) else (echo.!line!>>%$filename%))
del /q %filename%
ren "%$filename%" "%filename%"
pause
exit /b
http://forum.oszone.net/post-2667038-9.html
Вообще, такие скрипты пишутся для случаеd поиска и замены во многих файлах сразу. Если файл один, то хороший редактор с регулярками (AkelPad, Sublime, Notepad++, Syn2 ,... тысячи их) быстрей, удобней и проще.
angel_lyucifer
20-02-2017, 03:25
Мне нужен бат скрипт!
http://i84.fastpic.ru/big/2016/1106/bc/a27cbae4c26b71b6e7e537cd8cb16ebc.gif ↓↓↓
Название темы: [решено] Поиск замена текста (http://forum.oszone.net/post-2667038.html#post2667038)
angel_lyucifer
20-02-2017, 05:49
Наверно нужно экранировать символы?
megaloman
20-02-2017, 10:55
angel_lyucifer,@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "File=%AppData%\Skype\%SLOGIN%\config.xml"
rem Set "File=Z:\Box_In\config.xml"
Set "Rep1=^<AdvertPlaceholder^>0^</AdvertPlaceholder^>"
Set "Rep2=^<AdvertEastRailsEnabled^>0^</AdvertEastRailsEnabled^>"
>"%File%.bat.tmp" (FOR /F "usebackq delims=" %%s IN (`More "%File%"`) DO Echo %%s)
Set /A N1=0,N2=0,NN=0
FOR /F "usebackq Skip=2 delims=[]" %%n IN (`Find /N "<AdvertPlaceholder>1</AdvertPlaceholder>" "%File%.bat.tmp"`) DO Set N1=%%n
FOR /F "usebackq Skip=2 delims=[]" %%n IN (`Find /N "<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>" "%File%.bat.tmp"`) DO Set N2=%%n
>"%File%" (FOR /F "usebackq delims=" %%s IN (`More "%File%.bat.tmp"`) DO (
Set /A NN+=1
If Not !NN! EQU %N1% If Not !NN! EQU %N2% Echo %%s
If !NN! EQU %N1% Echo %Rep1%
If !NN! EQU %N2% Echo %Rep2%
))
DEL "%File%.bat.tmp" 2>NUL
Set WSS = CreateObject("WScript.Shell")
File_In = WSS.ExpandEnvironmentStrings("%AppData%") + "\Skype\" + WSS.ExpandEnvironmentStrings("%SLOGIN%") + "\config.xml"
'MsgBox File_In
'File_In = "Z:\Box_In\config.xml" ''''''''''''
File_Out = File_In
'File_Out = "Z:\Box_In\config.xml.vbs.tmp" ''''''''''''
ReMass = Array( _
"<AdvertPlaceholder>1</AdvertPlaceholder>", _
"<AdvertPlaceholder>0</AdvertPlaceholder>", _
"<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>", _
"<AdvertEastRailsEnabled>0</AdvertEastRailsEnabled>" _
)
N1 = LBound(ReMass)
N2 = UBound(ReMass)
'Set "File=%AppData%\Skype\%SLOGIN%\config.xml"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set NFile = FSO.OpenTextFile(File_In, 1, False)
S = NFile.ReadAll
NFile.Close
For i = N1 To N2 Step 2
S = Replace(S, ReMass(i), ReMass(i + 1))
Next
Set NFile = FSO.OpenTextFile(File_Out, 2, True)
NFile.Write S
NFile.Close
angel_lyucifer
20-02-2017, 18:45
rem Set "File=Z:\Box_In\config.xml" »
Поясните пожалуйста, зачем нужна эта строка?
megaloman
20-02-2017, 19:44
Поясните пожалуйста, зачем нужна эта строка? »
Эта строка не работает, она закомментирована (rem .....). Естественно, я не хотел отлаживать скрипт на своём живом рабочем файле, поэтому сделал его копию в этом месте. А не удалил строку - это Вам намёк, что можно точно так же сделать копию Вашего рабочего файла и тестировать скрипты, прописав отладочный путь и убрав коммент (rem). Точно так же и в VBS-скрипте: там тоже есть отладочные закомментированные строки. Кстати, переменной %SLOGIN% у меня не существует. Тем более мне надо иметь свой отладочный путь.
angel_lyucifer
20-02-2017, 20:37
@Echo Off SetLocal EnableExtensions EnableDelayedExpansion Set "File=%AppData%\Skype\%SLOGIN%\config.xml" rem Set "File=Z:\Box_In\config.xml" Set "Rep1=^<AdvertPlaceholder^>0^</AdvertPlaceholder^>" Set "Rep2=^<AdvertEastRailsEnabled^>0^</AdvertEastRailsEnabled^>" >"%File%.bat.tmp" (FOR /F "usebackq delims=" %%s IN (`More "%File%"`) DO Echo %%s) Set /A N1=0,N2=0,NN=0 FOR /F "usebackq Skip=2 delims=[]" %%n IN (`Find /N "<AdvertPlaceholder>1</AdvertPlaceholder>" "%File%.bat.tmp"`) DO Set N1=%%n FOR /F "usebackq Skip=2 delims=[]" %%n IN (`Find /N "<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>" "%File%.bat.tmp"`) DO Set N2=%%n >"%File%" (FOR /F "usebackq delims=" %%s IN (`More "%File%.bat.tmp"`) DO ( Set /A NN+=1 If Not !NN! EQU %N1% If Not !NN! EQU %N2% Echo %%s If !NN! EQU %N1% Echo %Rep1% If !NN! EQU %N2% Echo %Rep2% )) DEL "%File%.bat.tmp" 2>NUL »
Данный скрипт работает но не адекватно.
Он из файла удаляет определённые важные строки...
angel_lyucifer
20-02-2017, 20:55
переменной %SLOGIN% у меня не существует. »
Ее создаёт другой мой скрипт, в переменной %SLOGIN% хранится логин от Skype...
megaloman
20-02-2017, 21:08
angel_lyucifer, Если можно, представьте Ваш файл упаковав его, например, winrar. Какие строки удаляются? А vbs-скрипт справляется успешно?
Мой конфиг обработался успешно
angel_lyucifer
20-02-2017, 21:29
Цитата megaloman:
Если можно, представьте Ваш файл упаковав его, например, winrar. »
Вот. http://forum.oszone.net/attachment.php?attachmentid=143693&stc=1&d=1487615553
angel_lyucifer
20-02-2017, 21:56
А vbs-скрипт справляется успешно?
Из бат скрипта сложно передавать строку из переменной %SLOGIN% в vbs-скрипт...
megaloman
20-02-2017, 22:26
angel_lyucifer, У Вас в файле присутствуют строки с >9000 символов. Я не знаю, как в CMD это обработать. VBS работает нормально. Из бат скрипта сложно передавать строку из переменной %SLOGIN% в vbs-скрипт... » - элементарно, Ватсон! :)
@Echo Off
>"%~dpnx0.vbs" echo Set WSS = CreateObject("WScript.Shell")
>>"%~dpnx0.vbs" echo File_In = "%AppData%\Skype\%SLOGIN%\config.xml"
>>"%~dpnx0.vbs" echo 'MsgBox File_In
>>"%~dpnx0.vbs" echo File_In = "Z:\Box_In\config.xml" ''''''''''''
>>"%~dpnx0.vbs" echo File_Out = File_In
>>"%~dpnx0.vbs" echo File_Out = "Z:\Box_In\config.xml.vbs.tmp" ''''''''''''
>>"%~dpnx0.vbs" echo ReMass = Array( _
>>"%~dpnx0.vbs" echo "<AdvertPlaceholder>1</AdvertPlaceholder>", _
>>"%~dpnx0.vbs" echo "<AdvertPlaceholder>0</AdvertPlaceholder>", _
>>"%~dpnx0.vbs" echo "<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>", _
>>"%~dpnx0.vbs" echo "<AdvertEastRailsEnabled>0</AdvertEastRailsEnabled>" _
>>"%~dpnx0.vbs" echo )
>>"%~dpnx0.vbs" echo N1 = LBound(ReMass)
>>"%~dpnx0.vbs" echo N2 = UBound(ReMass)
>>"%~dpnx0.vbs" echo Set FSO = CreateObject("Scripting.FileSystemObject")
>>"%~dpnx0.vbs" echo Set NFile = FSO.OpenTextFile(File_In, 1, False)
>>"%~dpnx0.vbs" echo S = NFile.ReadAll
>>"%~dpnx0.vbs" echo NFile.Close
>>"%~dpnx0.vbs" echo For i = N1 To N2 Step 2
>>"%~dpnx0.vbs" echo S = Replace(S, ReMass(i), ReMass(i + 1))
>>"%~dpnx0.vbs" echo Next
>>"%~dpnx0.vbs" echo Set NFile = FSO.OpenTextFile(File_Out, 2, True)
>>"%~dpnx0.vbs" echo NFile.Write S
>>"%~dpnx0.vbs" echo NFile.Close
Call wscript "%~dpnx0.vbs"
del "%~dpnx0.vbs"
angel_lyucifer
20-02-2017, 22:45
Что мешает использовать VBS? »
Вот скрипт который определяет логин Skype и записывает в переменную %SLOGIN%.
For /F "delims=" %%A In ('Dir "%AppData%\Skype\main.db" /S /B') Do (set Skype=%%~A)
<Nul Set /P Echo=%Skype:~0,-8%>"%TEMP%\file.txt"
for /f "usebackq tokens=*" %%i in (`type "%TEMP%\file.txt"^|findstr.exe /r /i /c:"[a-z]:\\Users\\[^\\][^\\]*\\AppData\\Roaming\\Skype\\\\"`) do set "var=%%i"
ERASE /F /Q "%TEMP%\file.txt"
set "SLOGIN=%var:*\AppData\Roaming\Skype\=%"
Потом составляю путь к файлу, это выглядит так: %AppData%\Skype\%SLOGIN%\config.xml.
Как всё это можно было бы сделать с помощью VBS? Я не знаю...
megaloman
20-02-2017, 23:05
angel_lyucifer, Не вчитываюсь в Ваш код, но главное: Вы определили SLOGIN и Вы за него отвечаете. Поставьте текст Вашего скрипта после моего @Echo Off, удалите
>>"%~dpnx0.vbs" echo 'MsgBox File_In
>>"%~dpnx0.vbs" echo File_In = "Z:\Box_In\config.xml" ''''''''''''
>>"%~dpnx0.vbs" echo File_Out = "Z:\Box_In\config.xml.vbs.tmp" ''''''''''''
Должно получиться.
Вот второй вариант: имеем Ваш скрипт, Вы определили SLOGIN и Вы за него отвечаете. Необходимо иметь VBS -скрипт, при его вызове в него передадим путь к конфигу.
Итак, пусть vbs - скрипт находится Z:\vbsscript.vbs (естественно, Вам определять его имя и местоположение)
В Вашем батнике после определения SLOGIN пишем:
Set "VBS=Z:\vbsscript.vbs"
Call wscript "%VBS%" "%AppData%\Skype\%SLOGIN%\config.xml"
Set WSA = WScript.Arguments
If WSA.Count = 0 Then
MsgBox "Не передан аргумент"
Else
File_In = WSA(0)
File_Out = File_In
' MsgBox File_In
Set WSS = CreateObject("WScript.Shell")
ReMass = Array( _
"<AdvertPlaceholder>1</AdvertPlaceholder>", _
"<AdvertPlaceholder>0</AdvertPlaceholder>", _
"<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>", _
"<AdvertEastRailsEnabled>0</AdvertEastRailsEnabled>" _
)
N1 = LBound(ReMass)
N2 = UBound(ReMass)
Set FSO = CreateObject("Scripting.FileSystemObject")
Set NFile = FSO.OpenTextFile(File_In, 1, False)
S = NFile.ReadAll
NFile.Close
For i = N1 To N2 Step 2
S = Replace(S, ReMass(i), ReMass(i + 1))
Next
Set NFile = FSO.OpenTextFile(File_Out, 2, True)
NFile.Write S
NFile.Close
End If
angel_lyucifer
20-02-2017, 23:08
Вот экзотический способ: батник генерирует vbs-скрипт с нужным путём, запускает его, после работы удаляет. Радость в том, что не надо иметь отдельный vbs-файл »
Вы забыли экранировать, ладно я Вас понял.
Спасибо большое за терпение и понимания....
megaloman
20-02-2017, 23:12
Вы забыли экранировать » Я забыл убрать экранирование в 2 местах, @Echo Off
>"%~dpnx0.vbs" echo Set WSS = CreateObject("WScript.Shell")
>>"%~dpnx0.vbs" echo File_In = "%AppData%\Skype\%SLOGIN%\config.xml"
>>"%~dpnx0.vbs" echo File_Out = File_In
>>"%~dpnx0.vbs" echo ReMass = Array( _
>>"%~dpnx0.vbs" echo "<AdvertPlaceholder>1</AdvertPlaceholder>", _
>>"%~dpnx0.vbs" echo "<AdvertPlaceholder>0</AdvertPlaceholder>", _
>>"%~dpnx0.vbs" echo "<AdvertEastRailsEnabled>1</AdvertEastRailsEnabled>", _
>>"%~dpnx0.vbs" echo "<AdvertEastRailsEnabled>0</AdvertEastRailsEnabled>" _
>>"%~dpnx0.vbs" echo )
>>"%~dpnx0.vbs" echo N1 = LBound(ReMass)
>>"%~dpnx0.vbs" echo N2 = UBound(ReMass)
>>"%~dpnx0.vbs" echo Set FSO = CreateObject("Scripting.FileSystemObject")
>>"%~dpnx0.vbs" echo Set NFile = FSO.OpenTextFile(File_In, 1, False)
>>"%~dpnx0.vbs" echo S = NFile.ReadAll
>>"%~dpnx0.vbs" echo NFile.Close
>>"%~dpnx0.vbs" echo For i = N1 To N2 Step 2
>>"%~dpnx0.vbs" echo S = Replace(S, ReMass(i), ReMass(i + 1))
>>"%~dpnx0.vbs" echo Next
>>"%~dpnx0.vbs" echo Set NFile = FSO.OpenTextFile(File_Out, 2, True)
>>"%~dpnx0.vbs" echo NFile.Write S
>>"%~dpnx0.vbs" echo NFile.Close
Call wscript "%~dpnx0.vbs"
del "%~dpnx0.vbs"
Подобные вещи, за редким исключением, должны делаться посредством парсера XML на WSH/PoSH.
На WSH:
Option Explicit
Dim strSourceFile
Dim objFSO
If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strSourceFile) Then
With WScript.CreateObject("Microsoft.XMLDOM")
.load strSourceFile
.selectSingleNode("/config/UI/General/AdvertPlaceholder").Text = "0"
.selectSingleNode("/config/UI/General/AdvertEastRailsEnabled").Text = "0"
'objFSO.CopyFile strSourceFile, strSourceFile & ".bak", True
.save strSourceFile
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If
WScript.Quit 0
Путь к целевому файлу config.xml задаётся аргументом скрипта. Если заранее известно его расположение:
set filename=%AppData%\Skype\%SLOGIN%\config.xml :Это путь к файлу.
можно откорректировать с учётом этого скрипт. Что представляет собой %SLOGIN%, откуда она берётся, можно ли ей доверять? Не будет ли лучшим решением для определения пути к учётной записи покопаться во внутренностях %AppData%\Skype\shared.xml?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.