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

angel_lyucifer 20-02-2017 02:00 2713205

Замена строк.
 
Привет всем, есть файл 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


x0r 20-02-2017 02:44 2713208

http://forum.oszone.net/post-2667038-9.html

Вообще, такие скрипты пишутся для случаеd поиска и замены во многих файлах сразу. Если файл один, то хороший редактор с регулярками (AkelPad, Sublime, Notepad++, Syn2 ,... тысячи их) быстрей, удобней и проще.

angel_lyucifer 20-02-2017 03:25 2713211

Мне нужен бат скрипт!

x0r 20-02-2017 05:13 2713214

↓↓↓
Название темы: [решено] Поиск замена текста

angel_lyucifer 20-02-2017 05:49 2713216

Наверно нужно экранировать символы?

megaloman 20-02-2017 10:55 2713260

angel_lyucifer,
Вот CMD
Код:

@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

Но надёжнее VBS
Код:

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 2713413

Цитата:

Цитата megaloman
rem Set "File=Z:\Box_In\config.xml" »

Поясните пожалуйста, зачем нужна эта строка?

megaloman 20-02-2017 19:44 2713434

Цитата:

Цитата angel_lyucifer
Поясните пожалуйста, зачем нужна эта строка? »

Эта строка не работает, она закомментирована (rem .....). Естественно, я не хотел отлаживать скрипт на своём живом рабочем файле, поэтому сделал его копию в этом месте. А не удалил строку - это Вам намёк, что можно точно так же сделать копию Вашего рабочего файла и тестировать скрипты, прописав отладочный путь и убрав коммент (rem). Точно так же и в VBS-скрипте: там тоже есть отладочные закомментированные строки. Кстати, переменной %SLOGIN% у меня не существует. Тем более мне надо иметь свой отладочный путь.

angel_lyucifer 20-02-2017 20:37 2713456

Цитата:

Цитата megaloman
@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 2713465

Цитата:

Цитата megaloman
переменной %SLOGIN% у меня не существует. »

Ее создаёт другой мой скрипт, в переменной %SLOGIN% хранится логин от Skype...

megaloman 20-02-2017 21:08 2713472

angel_lyucifer, Если можно, представьте Ваш файл упаковав его, например, winrar. Какие строки удаляются? А vbs-скрипт справляется успешно?
Мой конфиг обработался успешно

angel_lyucifer 20-02-2017 21:29 2713477

Вложений: 1
Цитата megaloman:
Если можно, представьте Ваш файл упаковав его, например, winrar. »
Вот. http://forum.oszone.net/attachment.p...1&d=1487615553

angel_lyucifer 20-02-2017 21:56 2713493

Вложений: 1
А vbs-скрипт справляется успешно?
Из бат скрипта сложно передавать строку из переменной %SLOGIN% в vbs-скрипт...

megaloman 20-02-2017 22:26 2713510

angel_lyucifer, У Вас в файле присутствуют строки с >9000 символов. Я не знаю, как в CMD это обработать. VBS работает нормально.
Цитата:

Цитата angel_lyucifer
Из бат скрипта сложно передавать строку из переменной %SLOGIN% в vbs-скрипт... »

- элементарно, Ватсон! :)
Вот экзотический способ: батник генерирует vbs-скрипт с нужным путём, запускает его, после работы удаляет. Радость в том, что не надо иметь отдельный 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 2713517

Цитата:

Цитата megaloman
Что мешает использовать 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 2713525

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"

vbsscript.vbs имеет вид
Код:

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 2713528

Цитата:

Цитата megaloman
Вот экзотический способ: батник генерирует vbs-скрипт с нужным путём, запускает его, после работы удаляет. Радость в том, что не надо иметь отдельный vbs-файл »

Вы забыли экранировать, ладно я Вас понял.
Спасибо большое за терпение и понимания....

megaloman 20-02-2017 23:12 2713530

Цитата:

Цитата angel_lyucifer
Вы забыли экранировать »

Я забыл убрать экранирование в 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"


Iska 20-02-2017 23:37 2713539

Подобные вещи, за редким исключением, должны делаться посредством парсера 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?


Время: 06:10.

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