从批处理脚本返回值

Posted

技术标签:

【中文标题】从批处理脚本返回值【英文标题】:return value from batch script 【发布时间】:2013-05-24 06:03:43 【问题描述】:

我正在从 vbscript 调用批处理脚本。

在批处理脚本中,根据条件我想返回自定义退出代码。

@echo off
setlocal ENABLEDELAYEDEXPANSION`
for /f "usebackq" %%i in (`"%1"\fciv.exe" -md5 %2"`) do set md5_1=%%i  
for /f "usebackq" %%i in (`"%1"\fciv.exe" -md5 %3"`) do set md5_2=%%i

if "!md5_1!" == "!md5_2!" (  
    set md5_1=  
    set md5_2=  
    exit 0  
) else (  
    set md5_1=  
    set md5_2=  
    exit 1  
)
endlocal  

对于这两种情况,我的值都为 0。

谁能帮帮我?

【问题讨论】:

它对我来说很好用。发布您的脚本。 @echo off setlocal ENABLEDELAYEDEXPANSION for /f "usebackq" %%i in ("%1"\fciv.exe" -md5 %2") do set md5_1=%%i for /f "usebackq" %%i in ("%1"\fciv.exe" -md5 %3")如果 "!md5_1!" 则设置 md5_2=%%i == “!md5_2!” ( set md5_1= set md5_2= exit 0 ) else ( set md5_1= set md5_2= exit 1 ) endlocal 代码实际上是为两个文件生成校验和,如果相同则返回0,如果不同则返回1 您可以编辑您的问题以添加代码。另外,您需要使用exit /b <error code> 即使在错误条件下,我也将退出代码设为 0。如何获取退出代码 1? 我无法重现您的错误。对不起。 【参考方案1】:

批处理器 (cmd) 实际上会保留上次调用的错误级别。 要使用此功能,请不要在脚本末尾调用endlocal, 这是called implicitly anywayMSDN 此外,请始终在脚本中使用exit /b,因为正常的退出调用也会退出当前的批处理器实例

【讨论】:

【参考方案2】:

您的两个命令看起来都有不匹配的引号,并且可能会因名称太长而失败。试试这个

当发出 setlocal 时,您不会使用延迟扩展并且将变量归零是没有意义的。

不需要Usebackq。

最后,使用 %%i 是不好的做法,因为它看起来很像 %%l 和 %%1 我知道,Microsoft 在示例中使用它。

@echo off
setlocal
for /f %%a in ('"%~1\fciv.exe" -md5 "%~2"') do set md5_1=%%a  
for /f %%a in ('"%~1\fciv.exe" -md5 "%~3"') do set md5_2=%%a

if "%md5_1%"=="%md5_2%" (exit /b 0) else (exit /b 1 )
endlocal

【讨论】:

以上是关于从批处理脚本返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何在批处理文件脚本的循环中打印程序的返回值?

从 For 循环中获取值的批处理脚本

使用批处理脚本从多个相同的 .txt 文件中复制某个值 [重复]

从批处理文件运行python脚本时,如何自动将输入值传递给python“输入”函数

在 shell 脚本中返回多个值的习惯用法

bat脚本获取 exe返回值 ErrorLevel 的参数和设定