Windows批处理文件 – 在变量值中使用感叹号而不禁用延迟扩展
我有一个批处理脚本,用一个用户输入字符串替换源文本文件中几次出现的源字符串.
为此,我在这里使用了这个答案的略微修正版本: How to replace substrings in windows batch file (这不是公认的答案,被接受的答案确实更改了源文件!)但我只能解决一点“为每一行增加一个空间”-bug,而不是无法使用的主要问题内有感叹号的源文件! 对于这个剩下的问题,我研究了一些问题,例如发现(并尝试了以下建议)这些主题: 这就是这条线 有人知道如何解决这个问题吗? 编辑: setlocal disabledelayedexpansion for /f "tokens=1,* delims=?" %%A in ('"findstr /n ^^ %INTEXTFILE%"') do ( SET string=%%A setlocal enabledelayedexpansion for /f "delims=: tokens=1,*" %%A in ("!string!") do set "string=%%B" if "!string!" == "" ( echo.>>%OUTTEXTFILE% ) else ( SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! echo !modified!>> %OUTTEXTFILE% ) endlocal ) endlocal 可悲的是,这根本没有任何好处.这会产生与我为整个脚本启用延迟扩展时相同的输出文件. 解决方法
您编辑的代码中存在多个错误.
您正在使用findstr / n,这会在每行前面加上行号和冒号. 稍后您尝试删除行号和冒号 for /f "delims=: tokens=1,*" %%A in ("!string!") do set "string=%%B" 但是这也将删除输入文件的所有前导冒号并破坏所有感叹号,有时也会影响插入符号. 更好用 set "string=!string:*:=!" Remove all up to the first colon 然后你的两条回声线都很糟糕. 所以我们最终得到了 setlocal disabledelayedexpansion for /f "tokens=* delims=" %%A in ('"findstr /n ^^ %INTEXTFILE%"') do ( SET "string=%%A" setlocal EnableDelayedExpansion set "string=!string:*:=!" if defined string ( SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! ) (echo(!modified!) >> %OUTTEXTFILE% endlocal ) endlocal 回声线看起来有点奇怪,但它或多或少都很简单. (echo Sample) >> myOutputFile.txt 但是由于我们需要扩展具有未知内容的变量,因此这里不能使用普通的ECHO,请参阅此示例. set "var1=/?" set "var2= " set "var3=ON" echo %var1% echo %var2% echo %var3% 但回声(对任何内容都是安全的.它看起来很奇怪,但目前还没有人知道. 所以我简单地将echo(!variable!)括在括号中(echo(!variable!),其中只有外括号构建块,第二个左括号是echo命令的一部分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 任何人都可以为开发人员推荐一个好的备份“系统
- windows – 为什么我的用户的下载在IE中随机停止?
- active-directory – Windows 10没有获得gpo部署的打印机
- Chromium的Microsoft Edge预测版重在基本功能
- windows-xp – 使用USB打印机的DOS遗留应用程序
- windows-phone – Windows Phone 8 IconicTemplate Tile Im
- Windows下安装Redis
- 如何设置Squeak和Pharo的主窗口标题?
- 远程调试作为Windows服务启动的Java应用程序
- winapi – Win32消息队列有多深?