如何在批处理脚本中存储带有变量的函数?

时间:2018-06-29 12:00:25

标签: batch-file

我有一个批处理脚本,我正在尝试对字符串进行编码。我已经在Xor a string in a bat file

的帮助下成功编码了字符串

但是现在我想存储值%show%!val!在变量中,以便可以在脚本中的任何位置使用它。下面是我的代码。任何建议将不胜感激。

    @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

1 个答案:

答案 0 :(得分:0)

一种用于完成类似返回值(CMD实际上没有它们)的方法是将变量 name 传递给函数,并为其赋值(在setlocal之外)。

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%"

关键行是EXIT /B(或者您可以先使用ENDLOCAL,然后再使用EXIT /B)与赋值的组合,在赋值之前执行替换(延迟扩展)。