我正在尝试使用文件中的另一个字符串查找和替换字符串。
我有一个XML文件,其中port=
位于多个位置。每个端口都有不同的值,如port="443"
和port="8011"
。
我想找到一个特定的port
及其值。当值变化时,批处理执行时不知道port
的当前值。此变量和XML文件中一个特定port
属性的批处理执行未知值应替换为我作为参数传递给批处理文件的新值。
如何从文件中找到特定的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!
)
这是正确的方法,我该如何连接?
答案 0 :(得分:0)
How can you find and replace text in a file using the Windows command-line environment?列出了几个用于从命令行替换文件中的字符串的工具。
我喜欢免费的控制台工具 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="
<强>注意:强>
delims=
后面有4个字符,指示:
分隔符的顺序很重要,否则命令行解释器会因语法错误退出批处理脚本。
感兴趣的行被命令拆分为4个分隔符:
Connector
port
"third"
protocol
这4个标记分配给循环变量 A (标记名称), B (第一个属性的名称), C (值第一个属性)和 D (第二个属性的名称。
变量 A , B 和 D 的值用于检查是否找到了正确的行。变量 C 的值在正向检查时分配给环境变量,并删除周围的双引号。然后通过跳转退出循环以替换部分批处理脚本。
再次使用免费工具 xchang32.exe 在文件中进行替换而不更改任何其他内容。由于分配给属性 port 的值是一个整数值,因此必须在第一个^34
之后使用逗号让工具知道引用双引号字符的整数在哪里结束。 / p>
有关 命令的帮助,请在命令提示符窗口中for /?
或help for
执行。