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

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

我有一个批处理脚本,试图对字符串进行编码。在的帮助下,我成功地对字符串进行了编码

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

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