Windows 将函数的值返回给批处理脚本中的函数
这可能是SO、dostips和ss64中几个问题的重复。我所做的研究告诉我要注意函数中的作用域。但我的解决方案简单明了,但问题依然存在Windows 将函数的值返回给批处理脚本中的函数,windows,batch-file,cmd,scope,Windows,Batch File,Cmd,Scope,这可能是SO、dostips和ss64中几个问题的重复。我所做的研究告诉我要注意函数中的作用域。但我的解决方案简单明了,但问题依然存在 SETLOCAL和ENDLOCAL 如何在批处理脚本ex(goto)2>nul中工作 为什么(转到)用大括号括起来(在中解释) 这是我迄今为止编写的将文件从一个地方复制到另一个地方的代码。 我的目标是: 研究批处理脚本的范围和上下文 代码重用 好像是If_旗帜==0,正在检查应用程序文件夹是否存在于服务器根目录中,并且根本不工作。当我学会如何将参数传递给其他
SETLOCAL
和ENDLOCAL
(goto)2>nul中工作
(转到)
用大括号括起来(在中解释)- 研究批处理脚本的
和范围
上下文
- 代码重用
If_旗帜代码>==0,正在检查应用程序文件夹是否存在于服务器根目录中,并且根本不工作。当我学会如何将参数传递给其他函数时;我认为它传递的是一个类似于的引用的指针,但它似乎与范围
紧密相连。
那么代码中发生了什么。检查文件/Dir是否存在
您用来验证目录(?)是否存在的代码是
set %~3= dir /p|find /C "%~2"
我认为这不是你想要的。
SET/P
通常这样使用,以便将命令的输出通过管道传输到环境变量中。(不过,您正在将/P
赋给dir
,这可能不是您想要的结果。)不过,您使用的命令不会这样做。我猜这是在将var设置为(字面上的)“dir/p”,然后通过find count进行管道传输。但是,find.exe/C
的结果永远不会返回到envvar中。输出行“0”是通过find.exe/C
管道传输(无)的结果
我提出一个更简单的生存测试:
IF EXIST "%~2" (SET /A %~3=1) ELSE (SET /A %~3=0)
这个测试在我的Win10机器上运行
我看到IF EXIST
的工作方式存在一些差异。如果不想使用它,可以使用FOR
循环
FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1
如果要在FOR命令中使用管道,则必须将其转义
FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e
这三种方法对我都有效
SETLOCAL
我认为除了内置的帮助(SETLOCAL/?
)之外,没有关于cmd语法的官方参考指南
我的经验是,它将所有环境变量和工作目录推到一个“堆栈”上,相应的ENDLOCAL
或EXIT
(尽管在脚本中,您几乎总是希望使用EXIT/B
)将弹出该“堆栈”中的环境。实际上,这意味着您在SETLOCAL
中所做的envvar/CWD更改将只是暂时的。在中:检查,当您设置\u标志时,您实际上并没有运行该命令,而是将该变量设置为文本字符串。使用for/F
将命令输出存储在变量中。请注意,它是%~dp0
,而不是%~dp0%
尽管在脚本中,您几乎总是希望使用EXIT/B
。这是因为如果函数末尾未定义exist/b
,通常的执行流将继续自上而下,最终可能以递归结束,并达到最大递归深度。此技巧if exist“%~2”(SET/a%~3=1)ELSE(SET/a%~3=0)
解决了问题。
FOR /F "tokens=*" %%e IN ('DIR /B') DO IF "%%~e"=="%~2" SET /A %~3=1
FOR /F "tokens=*" %%e IN ('DIR /B ^| find /C "%~2"') DO SET /A %~3=%%~e