Batch file 从CMD创建函数(不带批处理文件)

Batch file 从CMD创建函数(不带批处理文件),batch-file,cmd,Batch File,Cmd,在批处理文件中,要定义一个函数,请先输入:符号,然后输入函数的名称 例如: :func 复制test.txt D:\test 然后,当您要调用函数时,请使用goto: 后藤函数 有没有一种方法可以在没有批处理文件的情况下做到这一点?要从cmd定义函数?:func不是函数,而是批处理文件中的标签。即转到的点。子例程/函数中没有类似的返回。:func不是函数,而是批处理文件中的标签。即转到的点。子程序/函数中没有类似的返回。Batch cmd.exe根本不知道函数 使用标签,您可以构建一个类似于函

在批处理文件中,要定义一个函数,请先输入:符号,然后输入函数的名称

例如:

:func 复制test.txt D:\test

然后,当您要调用函数时,请使用goto:

后藤函数


有没有一种方法可以在没有批处理文件的情况下做到这一点?要从cmd定义函数?

:func不是函数,而是批处理文件中的标签。即转到的点。子例程/函数中没有类似的返回。

:func不是函数,而是批处理文件中的标签。即转到的点。子程序/函数中没有类似的返回。

Batch cmd.exe根本不知道函数

使用标签,您可以构建一个类似于函数的构造,并用于返回use exit/b或goto:eof, 但实际上这不是一个函数。 但是标签只能在批处理文件中使用

另一方面,您可以使用宏,这些是带有代码的变量。 也没有真正的功能,但可以像一个

在本例中使用宏获取字符串长度:

set "var=abcdef"
%strlen% var
要生成宏,只需将其复制到命令提示符中即可

cmd /v:on 

set LF=^


::Above 2 blank lines are required - do not remove
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
:::: StrLen pString
set strLen=@for /L %n in (1 1 2) do @if %n==2 (%\n%
        for /F "tokens=1,2 delims=, " %1 in ("!argv!") do @(%\n%
              set "str=A^!%~1^!"%\n%
              set "len=0"%\n%
              for /l %A in (12,-1,0) do @(%\n%
                set /a "len|=1<<%A" ^> nul %\n%
                for %B in (^^!len^^!) do @if "^!str:~%B,1^!"=="" set /a "len&=~1<<%A" ^> nul%\n%
              )%\n%
              for %v in (^^!len^^!) do @if "%~2" neq "" (set "%~2=%v") else echo %v%\n%
        ) %\n%
) ELSE set argv=,
但是宏有一种变脏的趋势


或者你可以阅读,这是一个有点先进的技术

Batch cmd.exe根本不知道函数

使用标签,您可以构建一个类似于函数的构造,并用于返回use exit/b或goto:eof, 但实际上这不是一个函数。 但是标签只能在批处理文件中使用

另一方面,您可以使用宏,这些是带有代码的变量。 也没有真正的功能,但可以像一个

在本例中使用宏获取字符串长度:

set "var=abcdef"
%strlen% var
要生成宏,只需将其复制到命令提示符中即可

cmd /v:on 

set LF=^


::Above 2 blank lines are required - do not remove
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
:::: StrLen pString
set strLen=@for /L %n in (1 1 2) do @if %n==2 (%\n%
        for /F "tokens=1,2 delims=, " %1 in ("!argv!") do @(%\n%
              set "str=A^!%~1^!"%\n%
              set "len=0"%\n%
              for /l %A in (12,-1,0) do @(%\n%
                set /a "len|=1<<%A" ^> nul %\n%
                for %B in (^^!len^^!) do @if "^!str:~%B,1^!"=="" set /a "len&=~1<<%A" ^> nul%\n%
              )%\n%
              for %v in (^^!len^^!) do @if "%~2" neq "" (set "%~2=%v") else echo %v%\n%
        ) %\n%
) ELSE set argv=,
但是宏有一种变脏的趋势


或者你可以阅读,这是一个有点先进的技术,你可以制作一个宏

set func=copy test.txt D:\test 然后执行它,

%func%
你可以做一个宏

set func=copy test.txt D:\test 然后执行它,

%func%
您可以使用doskey宏来定义您经常重复的命令。您可以使用doskey宏来定义您经常重复的命令@i486,如果您呼叫LABEL@Squashman好的,这似乎是一个新功能。旧Windows批处理文件中没有调用/返回。返回由goto:eof或file@i486,如果您致电LABEL@Squashman好的,这似乎是一个新功能。旧Windows批处理文件中没有调用/返回。返回由goto:eof或文件结尾调用,但setlocal和endlocal在命令prompt下不起作用。您是对的。只是tested和setlocal没有封装一个临时作用域,endlocal也没有突破该作用域。但是setlocal和endlocal在命令promptYou's right下不起作用。只是tested和setlocal没有封装临时范围,endlocal也没有突破该范围。