尝试通过调用我的批处理文件中的函数将文本转换为十六进制,但十六进制代码永远不会返回到主批处理函数

Trying to convert text into hex by calling a function within my batch file, but the hex code never gets returned to the Main batch function

@echo off

goto :main

 
:strg2hex
setlocal EnableDelayedExpansion

rem Store the string in chr.tmp file
set /P "=%~1" < NUL > chr.tmp

rem Create zero.tmp file with the same number of Ascii zero characters
for %%a in (chr.tmp) do fsutil file createnew zero.tmp %%~Za > NUL

rem Compare both files with FC /B and get the differences
set "hex="
for /F "skip=1 tokens=2" %%a in ('fc /B chr.tmp zero.tmp') do set "hex=!hex!%%a"

del chr.tmp zero.tmp
echo The string to hex is %hex%

set %~1=%hex%

goto :eof



:main

     echo This is the main function!
 
     ::This interprets "tiger" as a string.
     ::This will convert text "tiger" into hex with the above function.
     call :strg2hex tiger
     Echo this is text "tiger" converted into hex: %hex%

Pause

goto :eof

代替

set %~1=%hex%

使用

endlocal&set "%~1=%hex%"&SET "hex=%hex%"

因为您正在执行 setlocal,当您 goto :eof 时,包含您更改的本地环境将被删除,并恢复原始的、未更改的环境。

这条语句之所以有效,是因为batch解析、代入然后执行命令,所以实际执行的是

 endlocal&set "tiger=7469676572"&SET "hex=7469676572"

所以本地环境被删除,则值为set.


@ECHO OFF
SETLOCAL
goto :main

 
:strg2hex
setlocal EnableDelayedExpansion

rem Store the string in chr.tmp file
set /P "=%~1" < NUL > chr.tmp

rem Create zero.tmp file with the same number of Ascii zero characters
for %%a in (chr.tmp) do DEL zero.tmp>nul&fsutil file createnew zero.tmp %%~Za > NUL

rem Compare both files with FC /B and get the differences
set "hex="
for /F "skip=1 tokens=2" %%a in ('fc /B chr.tmp zero.tmp') do set "hex=!hex!%%a"

rem del chr.tmp zero.tmp
echo The string to hex is %hex%

endlocal&SET "hex=%hex%"


goto :eof

:main
u:
     echo This is the main function!
 
     ::This interprets "tiger" as a string.
     ::This will convert text "tiger" into hex with the above function.
     call :strg2hex tiger
     Echo this is text "tiger" converted into hex: %hex%


IF "%*" neq "" FOR %%z IN (%*) DO  ECHO %%z&     call :strg2hex %%z

rem response to comment

SET "strng=Lion"
CALL :strg2hex %strng%
ECHO This variable "strng" has been converted into %hex%
ECHO This variable "strng" value "%strng%" has been converted into %hex%

GOTO :EOF

好吧 - 一些关于更彻底测试的惊喜...

首先,我使用 U: 进行测试 - 这就是它出现在 main 开头的原因。

接下来,我添加了一个新行,

IF "%*" neq "" FOR %%z IN (%*) DO  ECHO %%z&     call :strg2hex %%z

这会查看command-line“尾部”(命令行中程序名称后的数据)或参数 %*并分配每个依次为 %%z(参数可能是 space-separated 或 comma-separated),然后 echoes 参数和 calls 例程。因此,如果我们执行

q72120539 elephant lion zebra giraffe    

我们得到结果

elephant
The string to hex is 656C657068616E74
lion
The string to hex is 6C696F6E
zebra
The string to hex is 7A65627261
giraffe
The string to hex is 67697261666665

除了 tiger 文件夹。 q72120539 是我为这个程序起的名字。

我把两个临时文件的del 转成了备注,所以文件没有被删除,还能看到...

不幸的是,结果显示不是我所期望的。

尽管它的描述(或含义),fsutil file createnew NOT 如果存在现有文件则创建新文件- 它离开了 as-is。因此,在处理完名字 (tiger) 并且文件仍为 5 个字节后,代码没有更改文件。

我通过在执行 fsutil 命令之前故意删除 zero 文件来解决这个问题。

所以 - 现在都已修复,但我为临时文件“remmed-out”保留了 del,以便在例程结束时不会被删除。删除 rem 关键字并重新打开 clean-up 可能是个好习惯。

我还删除了 set "%~1=%hex%",因为保留它会 set 个名为 tigerelephantlionzebra 的变量, giraffe 每个到他们的 hex-value 字符串。


编辑以包含来自 OP 的示例。

结果是额外的

This variable "strng" has been converted into 4C696F6E
This variable "strng" value "Lion" has been converted into 4C696F6E

批处理中没有“函数”这样的东西,至少,例如,在 Pascal 中使用的意义上不是这样。 “return 值”简单地分配给一个已知变量,如本例所示。

可以通过使用这个call return任何变量中的值:

call :function fred 5 6 7

...

:function
set /a %1=%2+%3+%4
goto :eof

这会将 fred 的值设置为 18