Как хранить функцию с переменной в пакетном скрипте? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть пакетный скрипт, в котором я пытаюсь кодировать строку. Я успешно закодировал строку с помощью или строки в файле bat

Но теперь я хочу сохранить значение% 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 голосов
/ 29 июня 2018

Один из методов для выполнения чего-то вроде возвращаемых значений (на самом деле 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) и присваивание, в котором замещение происходит до его выполнения ( не отложенное расширение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...