batch-file - 百分比编码保留字符
问题描述
Wikipedia列出了我试图用百分比编码替换字符串中的几个保留字符。字符是:
特点 | 编码 |
---|---|
! | %21 |
# | %23 |
$ | %24 |
% | %25 |
& | %26 |
' | %27 |
( | %28 |
) | %29 |
* | %2A |
+ | %2B |
, | %2C |
/ | %2F |
: | %3A |
; | %3B |
= | %3D |
? | %3F |
@ | %40 |
[ | %5B |
] | %5D |
我的批处理脚本正在读取用户的输入,然后输出一个字符串,其中保留字符已被其百分比编码值替换。
问题是某些字符没有被读入,而其他字符在尝试对它们进行百分比编码时不起作用。
我的代码是
@echo off
setlocal EnableDelayedExpansion
set /p pass=Enter pass:
@REM Do % first so it doesn't replace all the new %
set "pass=!pass:%%=%%25!"
@REM Not working - set "pass=!pass:!=%%21!"
set "pass=!pass:#=%%23!"
set "pass=!pass:$=%%24!"
set "pass=!pass:&=%%26!"
set "pass=!pass:'=%%27!"
set "pass=!pass:(=%%28!"
set "pass=!pass:)=%%29!"
@REM Not working set "pass=!pass:*=%%2A!"
set "pass=!pass:+=%%2B!"
set "pass=!pass:,=%%2C!"
set "pass=!pass:/=%%2F!"
set "pass=!pass::=%%3A!"
set "pass=!pass:;=%%3B!"
@REM Not working set "pass=!pass:==%%3D!"
set "pass=!pass:?=%%3F!"
set "pass=!pass:@=%%40!"
set "pass=!pass:[=%%5B!"
set "pass=!pass:]=%%5D!"
echo %pass%
pause
我正在测试Test ! # $ % ' ( ) * + , / : ; = ? @ [ ]
.
文本中的!
似乎没有被读入字符串,我不得不注释掉三个字符转换,因为它们不起作用。
我怎样才能让它读到!在?如何转义 3 个注释掉的字符,以便将所有保留字符转换为它们的百分比编码?
解决方案
这是我会这样做的方式:
@echo off
setlocal EnableDelayedExpansion
set /P "pass=Enter pass: "
echo !pass: = !
rem Standard cases
for %%a in ("%%=25" "#=23" "$=24" "&=26" "'=27" "(=28" ")=29" "+=2B"
",=2C" "/=2F" ":=3A" ";=3B" "@=40" "[=5B" "]=5D" ) do (
for /F "tokens=1,2 delims== eol=" %%x in (%%a) do (
set "pass=!pass:%%x=%%%%y!"
)
)
rem First two special cases
setlocal DisableDelayedExpansion
set "pass=%pass:!=[21]%"
setlocal EnableDelayedExpansion
set "pass=!pass:[21]=%%21!"
set "pass=!pass:?=%%3F!"
rem Last two special cases
:star
for /F "tokens=1* delims=*" %%x in (" !pass! ") do (
if "%%y" neq "" (
set "pass=%%x%%2A%%y"
set "pass=!pass:~1,-1!"
goto star
)
)
:equal
for /F "tokens=1* delims==" %%x in (" !pass! ") do (
if "%%y" neq "" (
set "pass=%%x%%3D%%y"
set "pass=!pass:~1,-1!"
goto equal
)
)
echo %pass%
例子:
Enter pass: Test ! # $ % & ' ( ) * + , / : ; = ? @ [ ]
Test ! # $ % & ' ( ) * + , / : ; = ? @ [ ]
Test %21 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
推荐阅读
- sockets - 如何在python中实现ipv6?
- devops - 如何在开始时显示有关 Packer 构建的信息
- java - 在 XSSFWorkbook 如何将单元格类型设置为 NUMERIC 类型?
- asp.net-core - System.IO.FileNotFoundException: '未找到报告文件。'
- docker - Traefik Docker“主脚本未知”背后的 Nginx
- node.js - 亚马逊广告 API - 从 curl 转换为 node-fetch 时不支持内容类型
- javascript - 我不断收到使用 Cypress/Cucumber 的 Step 定义错误
- python - 当 status_code = 200 时使用 python 请求重试
- kotlin - 计算数字而不分开它们
- python - 如何自定义情节图例顺序?