提问人:Global.access.software 提问时间:12/3/2022 最后编辑:aschipflGlobal.access.software 更新时间:12/3/2022 访问量:52
在函数调用 [duplicate] 中使用 % 和变量
Using % with variables inside function call [duplicate]
问:
简单地说,它是
set /a mm=%r:~2,3%
但是,2 被编纂为 ,而 3 被编纂为 。set /a d=2
set /a l=3
那么,现在如何使用编码变量编写第一个表达式呢?
即 不起作用。有什么噱头?set /a mm=%r:~%d%,%l%%
我试过了......
set /a mm="%r:~(%%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
/A
set /a r=(%d%*%~4/%~3)
set /a digi=(%len%-%lngt%)
set /a rr=(%r%/1000)
/a
0赞
Global.access.software
12/4/2022
@Compo啊,好吧。所以它比我试图做的要简单,哈哈。我缺少关于使用分隔符的基本知识“和 % 在某处弄乱了几种语言。谢谢!
上一个:调用变量不起作用,该怎么办?
评论
setlocal enabledelayedexpansion
!r:~%d%,%l%!
CALL SET "mm=%%r:~%d%,%l%%%"
引号可以省略,但要小心。如果计算出的子字符串的第一个字符是 ,则 batch 将其定义为 OCTAL,因此您可能会得到意想不到的结果 - 事实上,如果剩余的任何字符是 or,那么您将收到错误,因为 并且是无效的八进制字符。0
8
9
8
9
!d!
!l!