我如何才能找到,并在批处理脚本另一个字符串替换字符串?(How can I find and rep

2019-10-21 11:46发布

我试图找到并在一个文件中的另一个字符串替换字符串。

我有一个XML文件,其中port=存在于多个位置。 每个端口有像不同的值port="443"port="8011"

我想找到一个特定的port和它的价值。 的当前值port作为值变化没有在批处理执行公知的。 一个具体的这个变量和批处理执行未知值port在XML文件中的属性应与我作为参数传递到批处理文件中一个新的值来代替。

我如何才能找到特定的port从一个文件中值,并用新值取代它呢?

我已经使用了替换字符串下面的代码,但我无法改变它的值。

if EXIST %ConfPath% (echo "here") ELSE (
    for /f "tokens=1,* delims=¶" %%A in ( '"type %file%"' ) do (
        SET string=%%A

        SET modified=!string:%oldport%=%newport%!

        echo !modified! 
    )
)

编辑:

下面是我的XML文件:

<?xml version='1.0' encoding='utf-8'?> 
<Server port="first" shutdown="SHUTDOWN">  
<Listener className="org.apache.catalina.core.JasperListener" /> 
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
<GlobalNamingResources> 
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> 
</GlobalNamingResources> 
<Service name="Catalina">  
<Connector port="second" redirectPort="forth" /> 
<Connector port="third" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8" keystoreFile="myKey" keystorePass="myPass" /> 
</Service> 
</Server> 

没有出现在上述文件中的四个端口。

我想改变port="third"port="newPort"

到现在为止我已经更换了字符串,但我不能用剩下的文件来连接它。

首先,我得到行号之后,我用引号和替换分裂。 但我我不能来连接它。 缺少的东西,但我无法找到它。

我的批号为:

for /f "tokens=1,* delims=" %%A in ( '"type %file%"' ) do (
    SET /a line+=1
    IF !line!==11 (
        SET string=%%A
        for /f tokens^=2^ delims^=^" %%I in ( "!string!" ) do (set repPort=%%I)
        SET modified=!string:repPort=PORT!
    )
    echo !modified!
)

这是正确的做法,我怎么可以连接?

Answer 1:

你怎么能找到并使用Windows命令行环境中的文件替换文本? 列出了命令行的文件替换字符串的工具。

我喜欢自由控制台工具xchang32.exe,因为它是强大的,非常容易使用。

我复制你的XML文件的内容到一个文件中,并命名保存的test.xml它。

然后,我执行以下命令:

xchang32.exe Test.xml "port=^34third^34 protocol" "port=^34newPort^34 protocol"

该命令的文件中只改变

<Connector port="third" protocol="HTTP/1.1" SSLEnabled="..." /> 

<Connector port="newPort" protocol="HTTP/1.1" SSLEnabled="..." /> 

^34为双引号字符的转义序列" ,其具有的十进制码值34。

xchang32.exe /? 进入并在命令提示符窗口输出帮助这个替换工具执行。

当然,你也可以使用引用的主题中提出的任何其他方法。 你只需要在搜索协议和替换字符串修改只应修改端口号,而忽略其他。 只使用Windows标准命令的解决方案,因为人物的更加困难<>"在这对命令行有特殊意义的XML文件。


编辑:

当然,要知道,在文件中的当前端口号不执行批处理文件称为一个重要的事实。 这不是对我来说是很清楚,从最初的问题。 这使得它更加困难。

一个解决方案是为现有的端口值第一的搜索和一旦发现做替换。

@echo off

rem Search in file for a line where first opening tag is
rem "Connector" which has as first attribute "port" and
rem one more attribute "protocol" and assign the value
rem of the attribute port to an environment variable.

for /F "tokens=1-4 delims==<     " %%A in (Test.xml) do (
    if "%%A"=="Connector" (
        if "%%B"=="port" (
            if "%%D"=="protocol" (
                set "PortNumber=%%~C"
                goto Replace
            )
        )
    )
)
echo Could not find the port value of interest.
goto :EOF

:Replace
xchang32.exe Test.xml "port=^34,%PortNumber%^34 protocol" "port=^34,%~1^34 protocol"
set "PortNumber="

注意:

有后4个字符delims=上有用于命令行:

  1. 一个等号,
  2. 左尖括号,
  3. 水平制表符(不是空格作为浏览器显示的序列)
  4. 一个空格字符。

否则命令行解释器将退出,因为语法错误的批处理脚本的分隔符的顺序是非常重要的。

感兴趣的线由命令这些4个定界符到分裂:

  • 令牌1: Connector
  • 令牌2: port
  • 令牌3: "third"
  • 令牌4: protocol
  • 多令牌不感兴趣。

那些4个令牌分配给循环变量A(标签名),B(第一属性的名称),C(第一属性的值)和d(第二属性的名称。

变量A,Bd的值用来检查是否正确的路线被发现。 变量C的值被分配在正检查的环境变量与除去周边双引号。 随后环路与跳跃退出来代替批处理脚本的一部分。

同样免费的工具xchang32.exe是用来做文件中的更换无需改变任何东西。 作为分配给属性端口的值是一个整数值,有必要使用逗号之后第一^34让工具知道引用双引号字符的整数结束。

有关命令帮助执行在命令提示符窗口中要么for /?help for



文章来源: How can I find and replace string with another string in batch script?