Batch file 如何在批处理脚本中存储带变量的函数?
我有一个批处理脚本,试图对字符串进行编码。在的帮助下,我成功地对字符串进行了编码 但现在我想存储值%show%!瓦尔!在变量中,以便可以在脚本中的任何位置使用它。下面是我的代码。如有任何建议,将不胜感激Batch file 如何在批处理脚本中存储带变量的函数?,batch-file,Batch File,我有一个批处理脚本,试图对字符串进行编码。在的帮助下,我成功地对字符串进行了编码 但现在我想存储值%show%!瓦尔!在变量中,以便可以在脚本中的任何位置使用它。下面是我的代码。如有任何建议,将不胜感激 @echo off setlocal enableDelayedExpansion call :init :: Curly braces are used to denote text that should be encrypted. :: Encryption can span m
@echo off
setlocal enableDelayedExpansion
call :init
:: Curly braces are used to denote text that should be encrypted.
:: Encryption can span multiple lines
:: {
:::password
:: }
:: Here I use a FOR loop to show all encrypted lines within this script
:: that begin with :::
for /f "delims=: tokens=*" %%A in ('findstr /b ":::" "%~f0"') do (
set val=%%A
set pwd = %show% !val!
)
echo %pwd%
exit /b
:show Str
::{
:: Nccyvrf gur fvzcyr "ebgngr nycunorg 13 cynprf" pvcure gb fgevat Fge
:: naq jevgrf gur erfhyg gb fgqbhg. Pbafrphgvir dhbgrf ("") ner pbairegrq
:: vagb n fvatyr dhbgr (").
::}
setlocal disableDelayedExpansion
set "str=%~1"
setlocal enableDelayedExpansion
set "str=!str:""="!^"
if defined {boshfpngrq} (
set "len=0"
set "str2=.!str!"
for /L %%A in (12,-1,0) do (
set /a "len|=1<<%%A"
for %%B in (!len!) do if "!str2:~%%B,1!"=="" set /a "len&=~1<<%%A"
)
set /a len-=1
set rtn=
for /l %%n in (0,1,!len!) do (
set "c=!str:~%%n,1!"
if defined {hccre}!c! for /f %%c in ("!c!") do (
if "!{hccre}:%%c=%%c!" equ "!{hccre}!" (
set "c=!{hccre}%%c!"
) else (
set "c=!{ybjre}%%c!"
)
)
set "rtn=!rtn!!c!"
)
) else set "rtn=!str!"
echo(!rtn!
exit /b 0
:init
set "}="
set "{="}
set "{hccre}=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "{ybjre}=abcdefghijklmnopqrstuvwxyz"
for /l %%A in (0 1 25) do (
set /a "B=(%%A+13)%%26"
for /f %%B in ("!B!") do (
set "{hccre}!{hccre}:~%%A,1!=!{hccre}:~%%B,1!"
set "{ybjre}!{ybjre}:~%%A,1!=!{ybjre}:~%%B,1!"
)
)
set "{boshfpngrq}="
set "{boshfpngvbaGrfg}={N}"
if "!{boshfpngvbaGrfg}:A=!" equ "!{boshfpngvbaGrfg}!" set {boshfpngrq}=1
set "show=call :show"
exit /b
@echo关闭
setlocal enableDelayedExpansion
呼叫:init
::大括号用于表示应该加密的文本。
::加密可以跨多行
:: {
::密码
:: }
::在这里,我使用FOR循环来显示此脚本中所有加密的行
::以开头的:::
对于/f“delims=:tokens=*”%%A in('findstr/b)::“%~f0”)do(
set val=%%A
设置pwd=%show%!val!
)
回声%pwd%
退出/b
:show Str
::{
:Nccyvrf gur fvzcyr“ebgngr nycunorg 13 cynprf”pvcure gb fgevat Fge
:naq jevgrf gur erfhyg gb fgqbhg.Pbafrphgvir dhbgrf(“”)ner pbairegrf
::vagb n fvatyr dhbgr(“)。
::}
setlocal disableDelayedExpansion
设置“str=%~1”
setlocal enableDelayedExpansion
设置“str=!str:“=”!^
如果定义{boshfpngrq}(
设置“len=0”
设置“str2=!str!”
对于(12,-1,0)do中的/L%%A(
set/a“len |=1实现返回值之类的功能的一种方法(CMD实际上没有返回值)是将变量名传递给函数,并让它为该名称赋值(在setlocal之外)
关键的一行是EXIT/B
(或者您可以使用ENDLOCAL
,然后使用EXIT/B
)和一个赋值的组合,其中替换在执行之前发生(而不是延迟扩展)。您可能重复使用的是set pwd=%show%!val!
不正确地使用set“pwd=%show%%%A"
并避免使用中间变量val。除此之外,我缺少一个问题,但这并不能解决问题。这是说文件名、目录名或卷标语法不正确。ECHO已关闭。我对批处理脚本编写有点幼稚。@mojo如果您能向我展示最终的实现,那就太好了?提前谢谢。!!:show
并不简单。我的建议是接受另一个参数(在参数列表的开头),%1
,并像我所示那样使用它。您必须将现有的集“str=%~1”
更改为集“str=%~2”
以允许使用新参数。您的脚本对我来说不太合适,因此我无法提供解决方案。
CALL :MYFUNC RETVAL 5 7 11
@ECHO Return Value: %RETVAL%
EXIT /B
:MYFUNC
SETLOCAL
SET DESTVAR=%~1
REM Do some other stuff.
SET /A TEMPVAR=%2 * %3 * %4
REM Now for the magic...
EXIT /B && SET "%DESTVAR%=%TEMPVAR%"