在函数调用 [duplicate] 中使用 % 和变量

Using % with variables inside function call [duplicate]

提问人:Global.access.software 提问时间:12/3/2022 最后编辑:aschipflGlobal.access.software 更新时间:12/3/2022 访问量:52

问:

简单地说,它是

set /a mm=%r:~2,3%

但是,2 被编纂为 ,而 3 被编纂为 。set /a d=2set /a l=3

那么,现在如何使用编码变量编写第一个表达式呢?

即 不起作用。有什么噱头?set /a mm=%r:~%d%,%l%%

我试过了......

set /a mm="%r:~(%%d),%%l%"以及各种其他编纂,但百分比使用率让我感到困惑。

Windows 变量 批处理文件 cmd

评论

0赞 SomethingDark 12/3/2022
这回答了你的问题吗?Windows 批处理命令嵌套变量具体来说,添加到脚本的顶部并使用setlocal enabledelayedexpansion!r:~%d%,%l%!
1赞 Magoo 12/3/2022
CALL SET "mm=%%r:~%d%,%l%%%"引号可以省略,但要小心。如果计算出的子字符串的第一个字符是 ,则 batch 将其定义为 OCTAL,因此您可能会得到意想不到的结果 - 事实上,如果剩余的任何字符是 or,那么您将收到错误,因为 并且是无效的八进制字符。08989
0赞 Global.access.software 12/3/2022
SomethingDark,如果我能弄清楚他们想说什么,我会研究并学习。哈哈。谢谢 Magoo,CALL 集而不是集似乎就是这样。::: 1000 所以 3 位精度到小数点右边。set /a lngt=3 set /a digi=(%len%-%lngt%) echo * & echo .& echo len==%len% digi==%digi% REM set /a mm=%r:~2,3% call set /a mm=(%%r:~%digi%,3%%%) 做到了。它是绕过模数并进入分数的一部分,只需通过将分子乘以 1000 来增加 3 位数字,然后在结果中将小数点滑动到左侧 3。效果很好!
0赞 Global.access.software 12/3/2022
@SomethingDark,不,具体部分不是这样工作的,它通过设置“%~2=%mm%”从此函数返回,并且返回的两个值的返回值都为“”。有 没有 CALL 集
0赞 SomethingDark 12/3/2022
如果从一组括号内调用子例程,则需要引用 and,但代码无法正确显示在注释中,因此很难看到您正在使用的内容。!d!!l!

答:

0赞 Global.access.software 12/3/2022 #1
@echo off
::: Experimental Module
set /a s=0
title %date% @ %time% playtime.bat by -JpE-

:start
if %s% geq 2 cls & set /a s=0
echo .
echo .
echo %date% @ %time%
set /a a=11 & set /a b=4 & set /a c=115
echo .
set /a s+=1
echo a==%a%, b==%b%, c==%c%
call :funct1 a,b,c
goto start

::::::::::::::::::::::::::::::::::::::::::::


:funct1
set g=%~2
set h=%~3
call :funct2 z,x,%g%,%h%
call :funct4 %z%,%x%,%g%,%h%
exit /b %errorlevel%


:funct2 <ReturnVar1, ReturnVar2, Arg_g, Arg_h>
set /a g=%~3 & set /a h=%~4
set /a r=1
set /a d=1000

if %g% neq 0 if %g% gtr 0 set /a r=(%d%*%~4/%~3)

::: Return z & x as %~1 & %~2
call :funct3 z,x,r
::::::::::::::::::::::::::::

set "%~1=%z%"
set "%~2=%x%"
exit /b %errorlevel%


::: Calc :::
:funct3 <rr,mm,r>
set /a r=%~3

set bats=C:\Users\JpE\Documents\AAA Sync2Laptop\Batch Files\BCS-Suite
set strlen="%bats%\string_length.bat"
call %strlen% len,r 
REM echo length of %r% is %len%
::: 1000 so 3 digits accuracy right of decimal point.
set /a lngt=3
set /a digi=(%len%-%lngt%)
echo * & echo . & echo len==%len% digi==%digi%
:::::::::::::::::::::::::
REM set /a mm=%r:~2,3%
call set /a mm=(%%r:~%digi%,%lngt%%%)
:::::::::::::::::::::::::
set /a rr=(%r%/1000)

::: Okay to here :::
echo sending back from funct3: rr==%rr%, mm==%mm%
set "%~1=%rr%"
set "%~2=%mm%"
exit /b %errorlevel%



::: Display :::
:funct4 <rr,mm,a,b,c>
echo .
echo A == %a%
echo B == %b%
echo C == %c%

echo .
echo C / B == %rr%.%mm%
echo .
pause
echo .
echo .
exit /b %errorlevel%


:return

echo Program Terminating
pause

评论

3赞 Compo 12/3/2022
停下!如果您不执行算术或使用其任何功能,请不要使用其选项。该选项并不表示变量是数字,所有变量都是字符串。看起来你只需要在三个地方需要它:这里,应该设置 /a “r=(d * %~4) / %~3”,或者设置 /a r=d * %~4 / %~3;这里 ,应设置 /a digi=len - lngt,此处设置 /a rr=r / 1000。可以删除所有其他实例。Set/A/Aset /a r=(%d%*%~4/%~3)set /a digi=(%len%-%lngt%)set /a rr=(%r%/1000)/a
0赞 Global.access.software 12/4/2022
@Compo啊,好吧。所以它比我试图做的要简单,哈哈。我缺少关于使用分隔符的基本知识“和 % 在某处弄乱了几种语言。谢谢!