替换批处理文件中的字符串部分

Replace portions of a string in a batch file

提问人:AndCAD 提问时间:11/17/2023 最后编辑:AndCAD 更新时间:11/18/2023 访问量:50

问:

作为一家小公司的 CAD 经理,我经常需要为每个新项目设置包含客户特定资源文件的项目文件夹。文件和文件夹位于不同位置,这可能是一个乏味的过程。

我创建了一个批处理文件,主要依赖于 robocopy,并使用了一堆简单的代码,这些代码是我在 Internet 上搜索来设置文件夹和文件名时学到的。它会提示我(用户)输入项目信息,然后根据该输入创建一组标准文件和文件夹。

这是我需要帮助的代码部分。这可能不是最好的方法,但它主要适用于我的目的。我正在尝试简化它/将其重写为更“正确”的方法。我很难让符号替换工作,因为似乎会破坏放在它后面的字符串,但我设法使用了一种解决方法,在第一个设置的字符串周围添加引号“ ”,然后在最后删除它们。&&

@echo off
echo Enter a brief Project description:
set /p projdesc=
echo.
REM # replace characters in description
set descname="%projdesc%"
set descname=%descname:the =%
set descname=%descname:to =_%
set descname=%descname: over =_%
set descname=%descname: at =_%
set descname=%descname: =%
set descname=%descname:&=-%
set descname=%descname:.=%
set descname=%descname:"=%
echo %descname%
pause

因此,如果我输入输出,则输出是. 但是如果我输入,我会收到一条错误消息,输出只有 .通过修复,它输出 .Rt.71 Bridge over Shark RiverRt71Bridge_SharkRiverBridges & TunnelsBridgesBridges-Tunnels

我使用了两个不同的变量 - 和 - 因为我在批处理文件中的其他位置使用原始描述,并在批处理文件的其他部分使用修改后的字符串作为文件夹名称的一部分。projdescdescname

我知道如果单词以 或 结尾,文本替换存在缺陷。那么我该如何解决这个问题呢?the to

更新

多亏了您的帮助,我才能够纠正解决“&”问题的语法。以下是更新后的代码:

@echo off
echo Enter a brief Project description:
set /p projdesc=
echo.
REM # replace characters in description
set "descname=%projdesc%"
set "descname=%descname:the =%"
set "descname=%descname:to =_%"
set "descname=%descname: over =_%"
set "descname=%descname: at =_%"
set "descname=%descname: =%"
set "descname=%descname:&=-%"
set "descname=%descname:.=%"
echo %descname%
pause

我敢肯定一定有更好的方法来做到这一点?

批处理文件 cmd

评论

1赞 Compo 11/17/2023
答案很简单,而不是你在答案中使用的。该命令的正确语法是 。在这种情况下,外部双引号不包括在变量名称或其字符串值中。setset "VariableName=StringValue"
0赞 Compo 11/17/2023
如果字符串或存在会发生什么?、 、 或 呢?bathebreatheintophotoghettomanifestomosquito
0赞 AndCAD 11/17/2023
很好的观点,而且在最初弄清楚如何最好地写它时,我绝对有顾虑......我想这就是我在这里问的原因。但它基本上有效,只是不适用于每种情况。我澄清了帖子并删除了我的答案,这并不是一个真正的答案。谢谢。
0赞 AndCAD 11/17/2023
@Compo 谢谢,这是一个简单的修复。根据您的评论,我将语法更正为等等,这解决了“&”问题。set "descname=%projdesc%"
0赞 Compo 11/18/2023
顺便说一句,您可以完全删除并以 开头,或者如果您不再使用初始输入,只需使用 etc.(当只使用一个变量时,您不需要有两个变量)。set "descname=%projdesc%"set "descname=%projdesc:the =%"set "projdesc=%projdesc:the =%"

答:

0赞 Mofi 11/18/2023 #1

我建议在批处理文件中使用以下命令行来获得故障安全版本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
:UserPrompt
set ProjDesc=
set /P "ProjDesc=Enter a brief project description: " || goto UserPrompt
rem Remove all douible quotes from project description.
set "ProjDesc=%ProjDesc:"=%"
if not defined ProjDesc goto UserPrompt
rem Remove or replace words and characters in description.
set "ProjDesc=%ProjDesc: the =%"
if not defined ProjDesc goto UserPrompt
set "ProjDesc=%ProjDesc:.=%"
if not defined ProjDesc goto UserPrompt
set "ProjDesc=%ProjDesc: at =_%"
set "ProjDesc=%ProjDesc: to =_%"
set "ProjDesc=%ProjDesc: over =_%"
set "ProjDesc=%ProjDesc:&=-%"
set "ProjDesc=%ProjDesc: =%"
if not defined ProjDesc goto UserPrompt
echo(
setlocal EnableDelayedExpansion
echo Project description is: !ProjDesc!
endlocal
echo(
pause
endlocal

请先阅读:如何阻止 Windows 命令解释器在用户输入不正确时退出批处理文件执行?它解释了为什么在进一步处理用户输入字符串之前首先用于删除所有字符串。|| goto UserPromptset "ProjDesc=%ProjDesc:"=%""

使用字符串替换时,变量名后等号的字符串总是有可能变成空字符串,由于没有第二个等号的字符串权限,因此删除了所有出现的字符串。这意味着执行导致环境变量的删除。由于这个原因,在到达下一个命令行时不再定义环境变量。set "ProjDesc="ProjDesc

Смотритетакже: 为什么在命令行上使用“set var = text”后没有带有“echo %var%”的字符串输出?它详细解释了为什么在批处理文件中处理环境变量的最佳语法是由 Windows 命令处理器处理的。set "variable=value"cmd.exe

DosTips 论坛主题 ECHO。无法给出文本或空行 - 改用 ECHO/ 解释使用或输出空行的原因。 在最好的情况下,在输出空行之前会导致两个易于避免的文件系统访问,在最坏的情况下,执行与空行输出不同的内容。echo(echo/echo.

最终项目描述的输出应该在启用延迟变量扩展的情况下完成,不要被封闭在里面,以避免执行由用户输入字符串导致的未存储在批处理文件中的命令,该字符串仍然可能包含具有特殊含义的字符,例如。"cmd.exe|