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

如何更换! 到批21%优雅?

我想replace! 到%21(url编码)批量,我的代码工作,但没有优雅的,任何理想的完成一行工作?

set pwd=!xxxxxxx set pwd=%pwd:!=@21@% setlocal enableDelayedExpansion echo !pwd:@21@=%%21! setlocal disabledelayedexpansion

batch file在Windows中运行其他batch file

在.bat / .cmd程序中更改块内的variables

仅对less数指定的扩展使用批处理脚本

Windows批处理:search文件中的所有文件,如果行包含“苹果”或“番茄”回声

如何创build删除文件的命令?

我不仅不能简化你的代码,我认为你的代码不够复杂。

如果发生以下任何情况,您的代码将失败

初始pwd值已经包含@21@

初始pwd值已经包含%21 。 大概你会想%编码为%25

初始值包含任何有毒字符,如& , | , < , >

简单地添加引号不能解决毒性问题,因为大概值也可以包含引号。 所以像"this & that" & the other thing这样的价值"this & that" & the other thing都会失败,不管你怎么引用它。

这里是健壮的代码,可以处理除null,回车和换行符以外的任何字符集。 我编码! 为%21 , %为%25 。 没有其他编码完成。

@echo off setlocal disableDelayedExpansion :: Set and display the initial value set pwd=;"This & that" ^& the other thing! %%25 %%21 @A @Q @P @E echo Before encoding: set pwd echo( :: Encoding begins here setlocal enableDelayedExpansion :: Protect @ as @A set "pwd=!pwd:@=@A!" :: Protect " as @Q set "pwd=!pwd:"=@Q!" :: Protect % as @P set "pwd=!pwd:%%=@P!" :: Encode ! as %21 in two steps set "pwd=%pwd:!=@E%" set "pwd=!pwd:@E=%%21!" :: Encode protected % as %25 set "pwd=!pwd:@P=%%25!" :: Restore protected Q set "pwd=!pwd:@Q="!" :: Restore protected @ set "pwd=!pwd:@A=@!" :: display the result echo After encoding: echo !pwd! endlocal

–OUTPUT–

Before encoding: pwd=;"This & that" & the other thing! %25 %21 @A @Q @P @E After encoding: ;"This & that" & the other thing%21 %2525 %2521 @A @Q @P @E

有时候你想在ENDLOCAL之后保存这个变量。 这可以很容易地通过FOR / F完成。 需要特殊的语法来禁用EOL和DELims选项。

我已经删除了所有的评论,以更好地显示所需的代码量。

@echo off setlocal disableDelayedExpansion set pwd=;"This & that" ^& the other thing! %%25 %%21 @A @Q @P @E echo Before encoding: set pwd echo( setlocal enableDelayedExpansion set "pwd=!pwd:@=@A!" set "pwd=!pwd:"=@Q!" set "pwd=!pwd:%%=@P!" set "pwd=%pwd:!=@E%" set "pwd=!pwd:@E=%%21!" set "pwd=!pwd:@P=%%25!" set "pwd=!pwd:@Q="!" for /f delims^=^ eol^= %%A in ("!pwd:@A=@!") do ( endlocal set "pwd=%%A" ) echo After encoding: set pwd

输出

Before encoding: pwd=;"This & that" & the other thing! %25 %21 @A @Q @P @E After encoding: pwd=;"This & that" & the other thing%21 %2525 %2521 @A @Q @P @E

通常,上面所示的简单FOR / F技术只有在禁用延迟扩展的情况下启动(和结束)时才起作用。 额外的代码将需要保护! 当%%A被展开并且延迟展开被启用。 但是既然你已经编码你的! 如

%21 ,如果在ENDLOCAL之后启用延迟扩展,则没有问题。

@echo off set pwd=!xxxxxxx set pwd=%pwd:!=@21@% setlocal enableDelayedExpansion echo !pwd:@21@=%%^21! setlocal disabledelayedexpansion

它会尝试用脚本的第二个参数替换%2 ,这样就可以使用%%^2来避免这种情况。

您可以通过PowerShell调用.NET System.Uri.EscapeUriString()方法,使用for /f捕获,以获得整洁的一行内容

for /f "usebackq delims=" %%I in (`powershell "[uri]::EscapeUriString('%pwd%')"`) do set "pwd=%%~I"

我想这是由你来决定是否合格。 *耸肩*除了[uri]::EscapeUriString() ,你也可以玩[uri]::EscapeDataString()来查看哪个方法提供了你想要的结果。

或者更快的执行,您可以使用一些JScript混合代码在您的数据上执行JavaScript的encodeURI()或encodeURIComponent() 。

@if (@CodeSection == @Batch) @then @echo off & setlocal set "pwd=http://www.google.com/search?q=Hello World!&gws_rd=ssl" for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%pwd%"') do set "pwd=%%I" setlocal enabledelayedexpansion echo(!pwd! endlocal goto :EOF @end // end Batch / begin JScript WSH.Echo(encodeURI(WSH.Arguments(0)))

我更喜欢将不同的值存储在不同的变量中,以保留(重要的)原件:

@ECHO OFF SETLOCAL EnableExtensions disableDelayedExpansion set "pwd=!xxx" set "pwX=%pwd:!=@21@%" set pw setlocal enableDelayedExpansion echo EDE !pwX:@21@=%%21! set "pwdAux=!pwX:@21@=%%21!" endlocal&set "pwX=%pwdAux%" set pw echo pwd %pwd% echo pwX %pwX%

输出

==> D:batSO36125004.bat pwd=!xxx pwX=@21@xxx EDE %21xxx pwd=!xxx pwX=%21xxx pwd !xxx pwX %21xxx ==>

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

相关推荐