Войти

Показать полную графическую версию : [решено] Замена одного текста на другой включая кавычки путем VBS через запуск команды в коман


vodashk@vk
02-07-2023, 23:27
Замена одного текста на другой включая кавычки путем 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
перепишите или напишите с нуля заменитель текста на повершелл
это
будет легче чем обучить вбскрипт не глотать кавычки в агрументах

vodashk@vk
03-07-2023, 01:46
повершелл »
и в powershell не вышло у меня)

Serguei Kouzmine
03-07-2023, 02:20
пробуйте сильнее

'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
уверяю вас vbscrip »
пока мучался сам сделал, зашел сюда потом увидел у вас, а я правильно сделал целиком код и текст не нарушится? Думал поделиться с ответом решением через cmd

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

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

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

Serguei Kouzmine
03-07-2023, 05:54
вопрос он не портит кодировку и текст оставляет в той же кодировке как и был »
- помомум незачем давать ему шанс что нибудь испортить - если можете укажите кодировку явно
и скрипт по моему всегда лучше чем вводить все в комадной строке поэтому подозреваю такое увлечение алиасами

Sham
03-07-2023, 08:30
"max_time="0"" » в cmd кавычки внутри кавычек экранируют обычно дублированием "max_time=""0"""

Serguei Kouzmine
03-07-2023, 15:36
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
кавычки исчезли »
да, реальная проблема. Я бы заменил на двойные одинарные '' ("max_time=''600''") и в скрипте менял бы replace'ом: replace(Wscript.Arguments(1), "''", """"). На SO вообще предлагают лезть в Win32_Process за исходной строкой - это на любителя.

vodashk@vk
18-07-2023, 00:04
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
Код
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
Значение, которое будет заменено, совершенно не нужно получать из файла, вряд ли в файле есть несколько одинаковых параметров.

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




© OSzone.net 2001-2012