问题描述
我需要创建一个您可以运行的批处理文件,该文件将编辑一个 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>
当前完整的 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
中的波浪号稍后会删除它们。这比转义毒字符更容易阅读。