gpt4 book ai didi

windows - 如何更换!优雅地分批处理到 %21?

转载 作者:可可西里 更新时间:2023-11-01 13:53:21 24 4
gpt4 key购买 nike

我要换!到 %21(url encode) 批量,我的代码可以工作,但一点也不优雅,有什么好的理想可以在一行中完成这项工作吗?

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

最佳答案

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

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

  • 初始pwd值已包含 @21@
  • 初始pwd值已包含 %21 .大概你想编码 %作为%25
  • 初始值包含任何有毒字符,如 & , | , < , >

简单地添加引号并不能解决毒字符问题,因为据推测该值也可以包含引号。所以像 "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

--输出--

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之后开启延迟扩展是没有问题的。

关于windows - 如何更换!优雅地分批处理到 %21?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36125004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com