Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена одного текста на другой включая кавычки путем VBS через запуск команды в коман (http://forum.oszone.net/showthread.php?t=353787)

vodashk@vk 02-07-2023 23:27 3011418

Замена одного текста на другой включая кавычки путем VBS через запуск команды в коман
 
Замена одного текста на другой включая кавычки путем VBS

Доброго Всем, как выполнить решение замены текста, включая те где содержат еще и кавычки
текст в файле
MAX_num=10 заменить на MAX_num=auto (замена происходит)
max_time="600" заменить на max_time="0" (замена не происходит)

Есть запуск файла VBS через cmd но он е обрабатывает текст где есть кавычки


Код:

@echo off & title replace & color 1F
setlocal
prompt $G

cscript //Nologo replace.vbs "default_temp" "max_time="600"" "max_time="0""
cscript //Nologo replace.vbs "default_temp" "MAX_num=10" "MAX_num=auto"
cscript //Nologo replace.vbs "default_temp" "use_net=no" "use_net=1"
cscript //Nologo replace.vbs "default_temp" "rom_on=off" "rom_on=on"

Есть файл VBS с именем replace.vbs с кодом замены текста с одного на другой в файле, где по видимому нужно дописать функцию обработки текста с кавычками

Код:

Const ForReading = 1   
Const ForWriting = 2
 
strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close
 
strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close


Serguei Kouzmine 03-07-2023 01:24 3011423

перепишите или напишите с нуля заменитель текста на повершелл
это
будет легче чем обучить вбскрипт не глотать кавычки в агрументах

vodashk@vk 03-07-2023 01:46 3011425

Цитата:

Цитата Serguei Kouzmine
повершелл »

и в powershell не вышло у меня)

Serguei Kouzmine 03-07-2023 02:20 3011426

пробуйте сильнее

Код:

'num="100"' -replace 'num=\"100\"' , 'num = "0"'


num = "0"

Код:

'num="100"' -replace 'num="100"' , 'nu
m = "0"'


num = "0"

- уверяю вас vbscript с кавычками это тупик

vodashk@vk 03-07-2023 02:52 3011427

Цитата:

Цитата Serguei Kouzmine
уверяю вас vbscrip »

пока мучался сам сделал, зашел сюда потом увидел у вас, а я правильно сделал целиком код и текст не нарушится? Думал поделиться с ответом решением через cmd

PowerShell -Command "(gc "default_temp") -replace 'max_time=\"600\"' , 'max_time=\"0\"' | sc "default_temp""

и вопрос он не портит кодировку и текст оставляет в той же кодировке как и был и не портит его содержимое

А так то результат положительный

Serguei Kouzmine 03-07-2023 05:54 3011432

Цитата:

Цитата vodashk@vk
вопрос он не портит кодировку и текст оставляет в той же кодировке как и был »

- помомум незачем давать ему шанс что нибудь испортить - если можете укажите кодировку явно
и скрипт по моему всегда лучше чем вводить все в комадной строке поэтому подозреваю такое увлечение алиасами

Sham 03-07-2023 08:30 3011436

Цитата:

Цитата vodashk@vk
"max_time="0"" »

в cmd кавычки внутри кавычек экранируют обычно дублированием "max_time=""0"""

Serguei Kouzmine 03-07-2023 15:36 3011448

Sham,
попробуйте добавить в скрипт
Код:

WScript.echo strOldText
увидите

Код:

cscript /Nologo replace.vbs "a.txt" "max_time=""600""" "max_time=""0"""

Код:

max_time=600
кавычки исчезли

Sham 03-07-2023 17:03 3011451

Цитата:

Цитата Serguei Kouzmine
кавычки исчезли »

да, реальная проблема. Я бы заменил на двойные одинарные '' ("max_time=''600''") и в скрипте менял бы replace'ом: replace(Wscript.Arguments(1), "''", """"). На SO вообще предлагают лезть в Win32_Process за исходной строкой - это на любителя.

vodashk@vk 18-07-2023 00:04 3012519

Sham, туда же и меня направило)
помог искусственный интеллект с ответом как ни странно

взялся за такую строку и решил сменить, все получилось
max_time="60" с этим получилось

при этом другие значения не затрагиваются
типа таких
mode="0"
mode='60'
mode=60
mode='600'
mode="600"
"60"
'60'

батник
Код
Код:

@echo off
cscript //NoLogo replace.vbs "config.xml" "max_time='60'" "max_time='0'"
pause

vbs
HTML код:

Код
Dim filePath, searchString, replaceString

filePath = WScript.Arguments.Item(0)
searchString = Replace(WScript.Arguments.Item(1), "'", Chr(34))
replaceString = Replace(WScript.Arguments.Item(2), "'", Chr(34))

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(filePath)

strContent = objFile.ReadAll
objFile.Close

strContent = Replace(strContent, searchString, replaceString)

Set objFile = objFSO.OpenTextFile(filePath, 2)
objFile.Write strContent
objFile.Close


DJ Mogarych 18-07-2023 11:03 3012549

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

Powershell
Код:

function replace-conf ($in,$key,$value) {
    $in -replace "$key=.*","$key=$value"
}

$txt = gc "D:\temp\log1.txt"

$txt = replace-conf $txt 'max_time' '"auto"'
$txt = replace-conf $txt 'MAX_num' '"999"'

$txt



Время: 23:20.

Время: 23:20.
© OSzone.net 2001-