在批处理脚本中处理特殊字符

Processing Special Characters in Batch Scripting

我正在制作文件和文件夹加密批处理脚本,我使用 Fatih Kodak 的 program.

从批处理转换为 exe

我的脚本的某些部分将文件或文件夹的路径加密为字母数字字符。我从其他人那里得到了这个脚本,我稍微修改了一下以处理其他特殊字符,但它仍然无法处理所有特殊字符。喜欢 &.

这是代码

:encrypt <out> <input>
::------------------------Encrypt
setlocal  ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
(set "CHAR[_A]=6l")
(set "CHAR[_B]=6m")
(set "CHAR[_C]=6n")
(set "CHAR[_D]=7o")
(set "CHAR[_E]=7p")
(set "CHAR[_F]=7q")
(set "CHAR[_G]=8r")
(set "CHAR[_H]=8s")
(set "CHAR[_I]=8t")
(set "CHAR[_J]=9u")
(set "CHAR[_K]=9v")
(set "CHAR[_L]=9w")
(set "CHAR[_M]=0x")
(set "CHAR[_N]=0y")
(set "CHAR[_O]=0z")
(set "CHAR[_P]=aa")
(set "CHAR[_Q]=ab")
(set "CHAR[_R]=ac")
(set "CHAR[_S]=bd")
(set "CHAR[_T]=be")
(set "CHAR[_U]=bf")
(set "CHAR[_V]=cg")
(set "CHAR[_W]=ch")
(set "CHAR[_X]=ci")
(set "CHAR[_Y]=dj")
(set "CHAR[_Z]=dk")
(set "CHAR[a]=el")
(set "CHAR[b]=em")
(set "CHAR[c]=en")
(set "CHAR[d]=fo")
(set "CHAR[e]=fp")
(set "CHAR[f]=fq")
(set "CHAR[g]=gr")
(set "CHAR[h]=gs")
(set "CHAR[i]=gt")
(set "CHAR[j]=hu")
(set "CHAR[k]=hv")
(set "CHAR[l]=hw")
(set "CHAR[m]=ix")
(set "CHAR[n]=iy")
(set "CHAR[o]=iz")
(set "CHAR[p]=j0")
(set "CHAR[q]=j1")
(set "CHAR[r]=j2")
(set "CHAR[s]=k3")
(set "CHAR[t]=k4")
(set "CHAR[u]=k5")
(set "CHAR[v]=l6")
(set "CHAR[w]=l7")
(set "CHAR[x]=l8")
(set "CHAR[y]=m9")
(set "CHAR[z]=ma")
(set "CHAR[0]=mb")
(set "CHAR[1]=nc")
(set "CHAR[2]=nd")
(set "CHAR[3]=ne")
(set "CHAR[4]=of")
(set "CHAR[5]=og")
(set "CHAR[6]=oh")
(set "CHAR[7]=pi")
(set "CHAR[8]=pj")
(set "CHAR[9]=pk")
(set "CHAR[`]=ql")
(set "CHAR[-]=qm")
(set "CHAR[=]=qn")
(set "CHAR[~]=ro")
(set "CHAR[!]=rp")
(set "CHAR[@]=rq")
(set "CHAR[#]=sr")
(set "CHAR[$]=ss")
(set "CHAR[%]=st")
(set "CHAR[&]=tu")
(set "CHAR[*]=tv")
(set "CHAR[(]=tw")
(set "CHAR[)]=ux")
(set "CHAR[_]=uy")
(set "CHAR[+]=uz")
(set "CHAR[^]=v0")
(set "CHAR[{]=v1")
(set "CHAR[}]=v2")
(set "CHAR[|]=w3")
(set "CHAR[[]=w4")
(set "CHAR[]]=w5")
(set "CHAR[\]=x6")
(set "CHAR[;]=x7")
(set "CHAR[']=x8")
(set "CHAR[,]=y9")
(set "CHAR[.]=ya")
(set "CHAR[/]=yb")
(set "CHAR[<]=zc")
(set "CHAR[>]=zd")
(set "CHAR[?]=ze")
(set "CHAR[ ]=ag")

set "Encrypt2=%2"
set "Encrypt2=!Encrypt2:"=!"
set "EncryptOut="
:enc2
set "char=%Encrypt2:~0,1%"
set "Encrypt2=%Encrypt2:~1%"
::Scans for Caps
for %%x in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    if "%%x" equ "%char%" (set "char=_%char%")
)
if "%char%" equ ":" (set EncryptOut=%EncryptOut%zf) else (
    set EncryptOut=%EncryptOut%!CHAR[%char%]!
)
if not "%Encrypt2%"=="" goto enc2
( endlocal
    set "%~1=%EncryptOut%"
)
if "%debug%" equ "yes" pause
exit /b

:decrypt <out> <input>
::------------------------Decrypt
setlocal  ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
(set "CHAR[6l]=A")
(set "CHAR[6m]=B")
(set "CHAR[6n]=C")
(set "CHAR[7o]=D")
(set "CHAR[7p]=E")
(set "CHAR[7q]=F")
(set "CHAR[8r]=G")
(set "CHAR[8s]=H")
(set "CHAR[8t]=I")
(set "CHAR[9u]=J")
(set "CHAR[9v]=K")
(set "CHAR[9w]=L")
(set "CHAR[0x]=M")
(set "CHAR[0y]=N")
(set "CHAR[0z]=O")
(set "CHAR[aa]=P")
(set "CHAR[ab]=Q")
(set "CHAR[ac]=R")
(set "CHAR[bd]=S")
(set "CHAR[be]=T")
(set "CHAR[bf]=U")
(set "CHAR[cg]=V")
(set "CHAR[ch]=W")
(set "CHAR[ci]=X")
(set "CHAR[dj]=Y")
(set "CHAR[dk]=Z")
(set "CHAR[el]=a")
(set "CHAR[em]=b")
(set "CHAR[en]=c")
(set "CHAR[fo]=d")
(set "CHAR[fp]=e")
(set "CHAR[fq]=f")
(set "CHAR[gr]=g")
(set "CHAR[gs]=h")
(set "CHAR[gt]=i")
(set "CHAR[hu]=j")
(set "CHAR[hv]=k")
(set "CHAR[hw]=l")
(set "CHAR[ix]=m")
(set "CHAR[iy]=n")
(set "CHAR[iz]=o")
(set "CHAR[j0]=p")
(set "CHAR[j1]=q")
(set "CHAR[j2]=r")
(set "CHAR[k3]=s")
(set "CHAR[k4]=t")
(set "CHAR[k5]=u")
(set "CHAR[l6]=v")
(set "CHAR[l7]=w")
(set "CHAR[l8]=x")
(set "CHAR[m9]=y")
(set "CHAR[ma]=z")
(set "CHAR[mb]=0")
(set "CHAR[nc]=1")
(set "CHAR[nd]=2")
(set "CHAR[ne]=3")
(set "CHAR[of]=4")
(set "CHAR[og]=5")
(set "CHAR[oh]=6")
(set "CHAR[pi]=7")
(set "CHAR[pj]=8")
(set "CHAR[pk]=9")
(set "CHAR[ql]=`")
(set "CHAR[qm]=-")
(set "CHAR[qn]==")
(set "CHAR[ro]=~")
(set "CHAR[rp]=!")
(set "CHAR[rq]=@")
(set "CHAR[sr]=#")
(set "CHAR[ss]=$")
(set "CHAR[st]=%")
(set "CHAR[tu]=&")
(set "CHAR[tv]=*")
(set "CHAR[tw]=(")
(set "CHAR[ux]=)")
(set "CHAR[uy]=_")
(set "CHAR[uz]=+")
(set "CHAR[v0]=^")
(set "CHAR[v1]={")
(set "CHAR[v2]=}")
(set "CHAR[w3]=|")
(set "CHAR[w4]=[")
(set "CHAR[w5]=]")
(set "CHAR[x6]=\")
(set "CHAR[x7]=;")
(set "CHAR[x8]='")
(set "CHAR[y9]=,")
(set "CHAR[ya]=.")
(set "CHAR[yb]=/")
(set "CHAR[zc]=<")
(set "CHAR[zd]=>")
(set "CHAR[ze]=?")
(set "CHAR[zf]=:")
(set "CHAR[ag]= ")

set Decrypt2=%2
set Decrypt2=!Decrypt2:"=!
set "DecryptOut="
:dc2
set "char=%Decrypt2:~0,2%"
set "Decrypt2=%Decrypt2:~2%"
set "DecryptOut=%DecryptOut%!CHAR[%char%]!"
if not "%Decrypt2%"=="" goto dc2
( endlocal
    set "%~1=%DecryptOut%"
)
if "%debug%" equ "yes" pause
exit /b

首先,Batch 不如其他语言的编译器聪明。像"&"这样的字符,是在一个命令后面加一个命令。例如,set "word=hello" & echo %hello%。所以,就像你所做的那样,(set "CHAR[tu]=&"),批量认为你正在这样做,(set "CHAR[tu]= & ")

为避免给脚本造成混乱和 "headache",只需使用 "^" 字符来指示您正在分配一个字符,例如 &、>、%,甚至是普通字符 a ,b,c 作为一个字符串。它不会对脚本产生太大影响,它只是执行它编写的代码。

这将起作用:(set "CHAR[tu]=^&").

附加信息:
如果你Setlocal EnableDelayedExpansion,你不能回显“!”字符, echo Hello! 甚至 echo Hello^!,你应该试试这个 echo Hello^^!.