《 实操记录——CMD返值方法 》 20200808 wypo
bat吧
全部回复
仅看楼主
level 9
WyPo🍺 楼主
</> 很多时候编写代码时为了减少代码的重复性以及便于管理整个代码的同步性更新和可利用性,都会使用到的东西——函数模块
如:
-=> ======== 《 不使用函数模块 》 ========
@璐村惂鐢ㄦ埛_000076K馃惥 off
set a=1
if "%a%"=="1" (
echo.-= DEMO =-
for /f "delims=" %%i in ('tasklist^|findstr /c:"explorer.exe"') do (echo.%%i)
echo.%cd%
)
if "%a%"=="2" (
echo.-= DEMO =-
for /f "delims=" %%i in ('tasklist^|findstr /c:"cmd.exe"') do (echo.%%i)
echo.%cd%
)
if "%a%"=="3" (
echo.-= DEMO =-
for /f "delims=" %%i in ('tasklist^|findstr /c:"svchost.exe"') do (echo.%%i)
echo.%cd%
)
pasue
exit
-=> ======== 《 使用函数模块 》 ========
@echo off
set a=1
if "%a%"=="1" call :DEMO "explorer.exe"
if "%a%"=="2" call :DEMO "cmd.exe"
if "%a%"=="3" call :DEMO "svchost.exe"
pause
exit
:DEMO
echo.-= DEMO =-
for /f "delims=" %%i in ('tasklist^|findstr /c:"%1"') do (echo.%%i)
echo.%cd%
goto :eof
</> 函数模块也分为可返值和不可返值
2020年08月08日 04点08分 1
level 9
WyPo🍺 楼主
</> 以下四个例子中的"DEMO"都属于函数模块
-=> ======== 《 Python 》 ========返值方法:return + 表达式
def DEMO(i):
r=i*i
return r
a=DEMO(5)
print("5*5=",a)
-=> ======== 《 C 》 ========返值方法:return + 表达式
#include<stdio.h>
int DEMO(int i)
{
r=i*i;
return r;
}
int main(void)
{
a=DEMO(8);
printf("8*8=%d/n",a)
return 0;
}
-=> ======== 《 VBS 》 ========返值方法:函数模块名称 + 表达式
function DEMO(i)
DEMO=i*i
end function
a=DEMO(9)
wsh.echo "9*9="&a
-=> ======== 《 CMD 》 ========返值方法:函数模块内部变量名
@璐村惂鐢ㄦ埛_000076K馃惥 off
call :DEMO 6
echo.%:DEMO%
for /f "delims=" %%a in ('set^|findstr /c":DEMO"') do (echo.%%a)
set /p=6*6=%r%
exit
:DEMO
set /a r=%1*%1
set :DEMO=%r%
goto :eof
</> 适当的使用函数模块可以提高编写效率
</> 很多时候,学习写新的编程语言命令尤其是函数模块时,都会想到的一个问题:函数模块的返值方法怎么写,这个编程语言它有没有返值这个概念。
</> 从上述的四个例子中可以看出,"Python\C"的函数模块"DEMO"都有来自"return"的返回值,"VBS\CMD"看似相同但"VBS"可以直接通过调用函数模块"DEMO"来直接赋值,"CMD"并不能,但可以通过"set"查看返回值。
</> 以上三个函数模块的直接赋值方法是"a=DEMO(7)",很明显"CMD"没有这个概念。
2020年08月08日 04点08分 2
level 9
WyPo🍺 楼主
</> 在图中的例子中,"#return"是函数的返回值,在内部当中调用函数模块后,"#return"它都是可直接使用,它属于全局变量,在"set"当中也有它的变量定义。
</> 如果我们调用的是像"VBS"这些的外部命令呢
</> 先看看调用"VBS"过程中的三种情况
</> 第一种情况:"set"有它的定义,整个运行过程看似很正常,但它就是没法使用,使用了就会出现第二种情况
</> 第二种情况:"set"有它的定义,但是我想使用它时它马上就给我出错,它:你说啥
</> 第三种情况:"set"有它的定义,此时我使用它时它并没有出错。此时我已提前开启了环境变量"setlocal ENABLEDELAYEDEXPANSION"
</> 这是使用外部命令的返值方法
</> 从以上的"C\VBS"命中看出,我只是让它们通过控制台打印信息并没有做其它的返值操作。VBS:"wsh.echo",C:"printf()"
</> 比如:"for /f %%a in ('dir /b') do (echo.%%a)",我只是看看它都有哪些信息,不是直接写"dir /b",直接写"dir /b"难以操作。
</> 在循环输出信息的过程中再通过"set"来将信息赋予新变量值达到返值效果
</> 如果我们通过调用外部的bat来赋值呢
</> 也是可以,但并不是都可以
</> 需要用到的返值方法是"echo",是"echo",并没有看错
</> 通过图上的运行过程中可以看出"Set"和"Sta"的标识符都没有出现,说明它"挂了","Cal"和"Ret"标识符还在。
</> 返值的方法是通过本地窗口调用外部命令在本地窗口运行后才有效,调用命令在外部窗口中运行后返值是没有效的。
</> "set"不管是通过本地窗口调用外部命令来赋值还是直接通过外部命令来赋值都是没有效果,调用完后它就会被清空不留下相关信息。
2020年08月08日 04点08分 3
level 9
WyPo🍺 楼主
-=> ======== 《 返值原理 》 ========
@璐村惂鐢ㄦ埛_000076K馃惥off & setlocal ENABLEDELAYEDEXPANSION
for /f %%a in ('call "%~dp0AB.bat"^|findstr /c:"
#return"') do (set #
return=%%a)
set /p=%
#return:#
return::=%
先调用,再通过"findstr"筛选出指定内容,将指定内容赋予新的变量名
返值,它只在同一个命令窗口中奏效
以上为个人的实操记录。WyPo11:50 2020/8/8
2020年08月08日 04点08分 4
1