微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows命令行stringreplace删除“!”

我有这个取代production:false小片段production:false与production:true 。

(FOR /F "tokens=1,* delims=]" %%A in ('"type test.js|find /n /v """') do ( set "line=%%B" if defined line ( call set "line=echo.%%line:production:false=production:true%%" FOR /F "delims=" %%X in ('"echo."%%line%%""') do %%~X ) ELSE echo. )) >test-temp.js move /Y test-temp.js test.js

到目前为止这么好,但是,在test.js中,它是这样描述的:

if ( !production ) {}

事情是, “!” 也被上面的命令删除 。 任何想法如何发生?

包含带有空格的可执行文件path的环境variables是否也包含必要的引号?

没有足够的权限来运行typeperf.exe

用于Windows 7的简单“javac”风格的命令行C / C ++编译器

在Windows上通过命令行设置JVM

删除xinetd导致plesk删除

从.bat调用Gradle会导致批处理执行停止

命令行全文索引?

GnuWin32或Cygwin – 从程序员的angular度来看

在Windows中获取一个进程命令行

maven 301永久移动

你可能已经调用了delayedexpansion 。

运行你的代码片段(这是你给我们的所有代码片段)对你提供的单行数据进行简单的转载。

用delayedexpansion 随着你的描述消失。

修理(用delayedexpansion效果

SETLOCAL disABLEDELAYEDEXPANSION (FOR /F "tokens=1,* delims=]" %%A in ('"type q19406461.txt|find /n /v """') do ( set "line=%%B" if defined line ( call set "line=echo.%%line:production:false=production:true%%" FOR /F "delims=" %%X in ('"echo."%%line%%""') do %%~X ) ELSE echo. )) >test-temp.js ENDLOCAL

这是一个强大的方法,并使用一个名为repl.bat的帮助程序批处理文件 – http://www.dostips.com/forum/viewtopic.PHP?f=3&t=3855

将repl.bat放在与批处理文件相同的文件夹中。

@echo off type "test.js"|repl "production:false" "production:true" >"test-temp.js"

彼得已经诊断出延迟扩张的问题。 这里有更多的解释。

FOR变量在延迟扩展之前被扩展。 因此, set "line=%%B"首先将值设置为if ( !production ) {} ,但是之后延迟的扩展会看到不成对! 并剥下它。 如果配对,它将试图扩大之间的变量。

下面是可变扩展顺序的总结(实际,但有点不准确):

1)正常扩展:参数(%1)和变量(%var%)。 参数优先于变量。

2)FOR变量:%% A

3)延迟扩展:!var!

4)SET / A变量

请参阅Windows命令解释器(CMD.EXE)如何解析脚本以更加准确地描述如何分析和展开行。

可以在循环中使用延迟扩展而不会损坏! 如果您打开和关闭延迟扩展,则为文字。 这比使用CALL语法更受欢迎,因为它速度更快,不会使用%字面值,也不会使用双引号插入符号,即使在未引用引号时也能防止所有有毒字符。

延迟扩展的使用使得代码更简单,更快,更可靠:

setlocal disableDelayedExpansion (FOR /F "tokens=1,* delims=]" %%A in ('"type test.js|find /n /v """') do ( set "line=%%B" setlocal enableDelayedExpansion if defined line ( echo(!line:production:false=production:true! ) ELSE echo( endlocal )) >test-temp.js move /Y test-temp.js test.js endlocal

请注意,我使用ECHO(而不是ECHO.因为后者可能会在一些模糊的情况下失败ECHO(看起来会导致块括号的问题,但它实际上始终没有任何问题。

请注意,我仍然不会使用上面的代码。 相反,我会使用REPL.BAT实用程序作为foxiderive在他的答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐