|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена строк. |
|
CMD/BAT - [решено] Замена строк.
|
Старожил Сообщения: 175 |
Профиль | Отправить PM | Цитировать Привет всем, есть файл config.xml в нём куча строк.
Мне нужно заменить строки На И На Я пытался создать скрипт но не получилось, попробуйте исправить мой скрипт пожалуйста... 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 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать angel_lyucifer, Если можно, представьте Ваш файл упаковав его, например, winrar. Какие строки удаляются? А vbs-скрипт справляется успешно?
Мой конфиг обработался успешно |
------- Последний раз редактировалось megaloman, 20-02-2017 в 21:15. Отправлено: 21:08, 20-02-2017 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 175
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Если можно, представьте Ваш файл упаковав его, например, winrar. » Вот. http://forum.oszone.net/attachment.p...1&d=1487615553 |
------- Отправлено: 21:29, 20-02-2017 | #12 |
Старожил Сообщения: 175
|
Профиль | Отправить PM | Цитировать А vbs-скрипт справляется успешно?
Из бат скрипта сложно передавать строку из переменной %SLOGIN% в vbs-скрипт... |
------- Отправлено: 21:56, 20-02-2017 | #13 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать angel_lyucifer, У Вас в файле присутствуют строки с >9000 символов. Я не знаю, как в CMD это обработать. VBS работает нормально.
Цитата angel_lyucifer:
Вот экзотический способ: батник генерирует 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 |
Старожил Сообщения: 175
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
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\=%" Как всё это можно было бы сделать с помощью VBS? Я не знаю... |
|
------- Отправлено: 22:45, 20-02-2017 | #15 |
Ветеран Сообщения: 2728
|
Профиль | Отправить 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 пишем: 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 |
Старожил Сообщения: 175
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Спасибо большое за терпение и понимания.... |
|
------- Отправлено: 23:08, 20-02-2017 | #17 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата angel_lyucifer:
я поправил код, не надо экранировать
@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
|
Профиль | Отправить 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 задаётся аргументом скрипта. Если заранее известно его расположение: Цитата:
|
|
Отправлено: 23:37, 20-02-2017 | #19 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|