提问人:AndCAD 提问时间:11/17/2023 最后编辑:AndCAD 更新时间:11/18/2023 访问量:50
替换批处理文件中的字符串部分
Replace portions of a string in a batch file
问:
作为一家小公司的 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 River
Rt71Bridge_SharkRiver
Bridges & Tunnels
Bridges
Bridges-Tunnels
我使用了两个不同的变量 - 和 - 因为我在批处理文件中的其他位置使用原始描述,并在批处理文件的其他部分使用修改后的字符串作为文件夹名称的一部分。projdesc
descname
我知道如果单词以 或 结尾,文本替换存在缺陷。那么我该如何解决这个问题呢?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
我敢肯定一定有更好的方法来做到这一点?
答:
我建议在批处理文件中使用以下命令行来获得故障安全版本:
@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 UserPrompt
set "ProjDesc=%ProjDesc:"=%"
"
使用字符串替换时,变量名后等号的字符串总是有可能变成空字符串,由于没有第二个等号的字符串权限,因此删除了所有出现的字符串。这意味着执行导致环境变量的删除。由于这个原因,在到达下一个命令行时不再定义环境变量。set "ProjDesc="
ProjDesc
Смотритетакже: 为什么在命令行上使用“set var = text”后没有带有“echo %var%”的字符串输出?它详细解释了为什么在批处理文件中处理环境变量的最佳语法是由 Windows 命令处理器处理的。set "variable=value"
cmd.exe
DosTips 论坛主题 ECHO。无法给出文本或空行 - 改用 ECHO/ 解释使用或输出空行的原因。 在最好的情况下,在输出空行之前会导致两个易于避免的文件系统访问,在最坏的情况下,执行与空行输出不同的内容。echo(
echo/
echo.
最终项目描述的输出应该在启用延迟变量扩展的情况下完成,不要被封闭在里面,以避免执行由用户输入字符串导致的未存储在批处理文件中的命令,该字符串仍然可能包含具有特殊含义的字符,例如。"
cmd.exe
|
评论
set
set "VariableName=StringValue"
bathe
breathe
into
photo
ghetto
manifesto
mosquito
set "descname=%projdesc%"
set "descname=%projdesc%"
set "descname=%projdesc:the =%"
set "projdesc=%projdesc:the =%"