用包含 > /< 符号替换多行文本文件的批处理代码

问题描述

我需要创建一个您可以运行的批处理文件,该文件将编辑一个 txt 文件,并有 5 个单独的选择来选择如何编辑。该文件是针对特定服务器的程序的配置文件。我认为与其更改特定的服务器,不如重写整个内容(只有 8 行)会更容易。我当前的问题是该文件包含 的多种用途。

正在创建的文件示例:

<AppSettings>
  <IsWebService>False</IsWebService>
  <AppServerIP>IP address</AppServerIP>
  <AppServerPort>Port Number</AppServerPort>
  <EnterpriseID />
  <CentralFileServerIP>IP address</CentralFileServerIP>
  <CentralFileServerPort>Port number</CentralFileServerPort>
</AppSettings> 

目前我在第一个之后遇到语法错误(我目前正在研究选项 1)。

当前完整的 bat 文件

@ECHO OFF
CLS
ECHO Which agency would you like to switch to?
ECHO 1.COMME70 - Commercial Underwriters Ins Agency,LLC
ECHO 2.CLEME12 - Clements Insurance Services
ECHO 3.MCELV02 - McElveen Insurance and Bonds
ECHO 4.JOnes46 - Jones Insurance Services,LLC
ECHO 5.RIGIN01 - Rig Insurance Services,LLC
ECHO.

CHOICE /C 12345 /M "Enter your choice:"

IF ERRORLEVEL 5 GOTO RIGIN01
IF ERRORLEVEL 4 GOTO JOnes46
IF ERRORLEVEL 3 GOTO MCELV02
IF ERRORLEVEL 2 GOTO CLEME12
IF ERRORLEVEL 1 GOTO COMME70

:COMME70
ECHO Loading  COMME70 Data
del C:\ASI\ASI.TAM\ThinClient\Data\SMART.config
ECHO PrevIoUs data deleted
ECHO Setting up new data

echo ^<AppSettings^>^ 

> C:\ASI\ASI.TAM\ThinClient\Data\SMART.config

GOTO End

**********Other options added here*************

GOTO End

:End

解决方法

猜测,因为您没有指定错误消息发生的位置,所以我们必须阅读和评估所有代码,这浪费了我们的时间。

echo ^<AppSettings^>^ 

> C:\ASI\ASI.TAM\ThinClient\Data\SMART.config

echo 行中的最后一个插入符号有效地将这三行序列中的第二行附加到第一行,因此 cmd 看到

echo ^<AppSettings^>
> C:\ASI\ASI.TAM\ThinClient\Data\SMART.config

这显然是一个 echo 命令(您没有提到任何输出),然后是一个重定向的 nothing 命令,这会提供语法错误。

然而……echo 行有一个终端 space 所以插入符号多余地转义了 Space,而不是 new 行

cmd解释

echo ^<AppSettings^>  

> C:\ASI\ASI.TAM\ThinClient\Data\SMART.config

...同样的问题,但 echo 有一个终端 Space 并且在重定向的 nothing 命令之前有一个空行

(
echo ^<AppSettings^>
)> C:\ASI\ASI.TAM\ThinClient\Data\SMART.config

可能会按照您的意愿行事。

,

写文件的代码我就不重复了,方便以后维护。改用变量。这样你就有了一个只填充了不同数据的模板:

@echo off
rem ...
if %errorlevel% == 1 set "EnterpriseID=Commercial Underwriters Ins Agency,LLC" & set "IPaddress=256.315.412.523"
if %errorlevel% == 2 (
  set "EnterpriseID=Clements Insurance Services"
  set "IPaddress=257.318.413.524"
)
rem ...

>"C:\ASI\ASI.TAM\ThinClient\Data\SMART.config" (
for %%a in (
    "<AppSettings>"
    "  <IsWebService>False</IsWebService>"
    "  <AppServerIP>IP address</AppServerIP>"
    "  <AppServerPort>Port Number</AppServerPort>"
    "  <%EnterpriseID% />"
    "  <CentralFileServerIP>%IPaddress%</CentralFileServerIP>"
    "  <CentralFileServerPort>Port number</CentralFileServerPort>"
    "</AppSettings>"
  ) do @echo %%~a 
)

(我不得不猜测在什么地方插入什么;只是为了说明原理)

字符串周围的引号保护有毒字符(例如 <>,但也包括 &,这在企业名称中很常见)。 %%~a 中的波浪号稍后会删除它们。这比转义毒字符更容易阅读。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...