Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена строк.

Ответить
Настройки темы
CMD/BAT - [решено] Замена строк.

Аватара для angel_lyucifer

Старожил


Сообщения: 175
Благодарности: 4


Конфигурация

Профиль | Отправить PM | Цитировать


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

-------
Век живи, век учись! =)


Отправлено: 02:00, 20-02-2017

 

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-02-2017 в 21:15.


Отправлено: 21:08, 20-02-2017 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для angel_lyucifer

Старожил


Сообщения: 175
Благодарности: 4

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar config.rar
(12.9 Kb, 3 просмотров)

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

-------
Век живи, век учись! =)


Отправлено: 21:29, 20-02-2017 | #12


Аватара для angel_lyucifer

Старожил


Сообщения: 175
Благодарности: 4

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar config.rar
(12.9 Kb, 6 просмотров)

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

-------
Век живи, век учись! =)


Отправлено: 21:56, 20-02-2017 | #13


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-02-2017 в 23:11.


Отправлено: 22:26, 20-02-2017 | #14


Аватара для angel_lyucifer

Старожил


Сообщения: 175
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата 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? Я не знаю...

-------
Век живи, век учись! =)


Отправлено: 22:45, 20-02-2017 | #15


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:05, 20-02-2017 | #16


Аватара для angel_lyucifer

Старожил


Сообщения: 175
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

-------
Век живи, век учись! =)


Отправлено: 23:08, 20-02-2017 | #17


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Цитата 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"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-02-2017 в 23:17.


Отправлено: 23:12, 20-02-2017 | #18


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:37, 20-02-2017 | #19



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена строк.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Замена строк в файле по признаку и маске ВиталийВ Скриптовые языки администрирования Windows 12 13-09-2015 07:54
CMD/BAT - Поиск и замена строк в ini-файлах alex_frog Скриптовые языки администрирования Windows 10 25-11-2014 22:48
PowerShell - [решено] Замена строк по всему массиву. love_fist911 Скриптовые языки администрирования Windows 2 26-08-2013 19:01
CMD/BAT - Замена нескольких строк в файле bcubbs@fb Скриптовые языки администрирования Windows 3 24-01-2013 14:01
CMD/BAT - [решено] Замена строк конфига The_Name Скриптовые языки администрирования Windows 4 22-09-2009 11:19




 
Переход