bat中如何获取命令执行后的结果

本文主要介绍了在Windows BAT脚本中如何执行ADB命令并获取其执行结果,特别是在删除和创建手机文件夹操作后判断是否成功的技巧。通过示例展示了如何结合for和defined来判断命令执行是否为空,从而实现对命令执行状态的检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在大多数的办公设备都是WIndows,只不过企业中基本上全都在使用win10系统!

有时为了工作的效率提升,可以尝试将那些复杂无用的操作写成bat脚本,让其自己执行!

bat中可以糅合各种指令,包括:python,java,shell,adb等等,包括你知道的和不知道的!

最近在工作中总是有一个繁琐的操作很是让人头疼:

①将安装包copy至手机指定目录

②安装APK

于是乎,我想将这个操作写入bat中,以后执行bat脚本就可以完成上面的步骤!

但是今天想说的是在码代码过程中遇到的一个问题:

bat中执行了adb shell命令来删除手机上的文件夹和创建文件夹,我如何知道删除成功与否以及创建成功与否呢?

这就需要了解“bat中如何获取命令执行后的结果”!

1.案例:在手机中创建指定文件夹

rem 判断InstallerPackage文件夹是否存在
for /f "tokens=*" %%i in ('adb shell mkdir %targetPath%') do (
	set vars=%%i
)
if defined vars (
	rem adb shell命令执行的结果不为空:执行失败
	rem InstallerPackage文件夹已经存在
	goto :empty
) else (
	rem adb shell命令执行成功
	rem 创建InstallerPackage文件夹并推送
	goto :push
)

通过上面的for可以获取adb命令的执行结果,但上面的adb命令执行成功后其返回值是空

进而还需要通过defined来对执行结果进行判空!

2.执行python脚本并获取执行结果

**test.py

# -*- coding: utf-8 -*-
__author_
<think>我们正在处理用户关于在Jenkins中通过bat脚本执行命令并捕获返回值的问题。用户提供的引用内容是一个bat脚本示例,用于根据端口号杀死进程,但用户的实际需求是执行命令并捕获返回值。关键点:1.在Jenkins中,通常通过bat脚本执行命令。2.需要捕获命令的返回值(即退出码)以便在Jenkinspipeline中根据返回值进行后续操作。解决方案:在bat脚本中,每个命令执行后都会有一个退出码(errorlevel),我们可以通过`%errorlevel%`来获取上一个命令的退出码。在Jenkinspipeline中,我们可以将bat脚本的返回值赋值给一个变量,然后根据这个变量值进行判断。步骤:1.在bat脚本中,执行命令后,我们可以使用`exit/b<value>`来返回特定的退出码。2.或者,我们可以在bat脚本中直接使用`exit%errorlevel%`来将上一条命令的退出码作为整个脚本的退出码。3.在Jenkinspipeline中,使用`bat`步骤的`returnStatus`参数可以捕获退出码(注意:`returnStatus`为true时,返回退出码,此时不会因为非零退出码而失败;如果为false,则非零退出码会导致构建失败)。示例:假设我们有一个bat脚本,执行一个命令,然后我们需要捕获这个命令的退出码,并在Jenkinspipeline中获取它。方法一:直接使用bat步骤并设置returnStatus:true```groovydefreturnCode=bat(script:'your_command',returnStatus:true)```方法二:在bat脚本中控制退出码,然后在Jenkins中获取例如,在bat脚本中:```batchyour_commandexit/b%errorlevel%```然后在Jenkinspipeline中:```groovydefreturnCode=bat(script:'path/to/your_script.bat',returnStatus:true)```注意:如果使用`returnStatus:true`,则Jenkins会将脚本的退出码作为返回值,并且不会因为非零退出码而失败。如果使用`returnStdout:true`,则可以捕获标准输出,但此时退出码会被忽略(除非使用特殊技巧)。用户可能想同时捕获输出和退出码?但通常不能同时使用returnStatus和returnStdout。因此,如果需要同时捕获,可能需要将退出码输出到文件,或者通过多个步骤实现。另一种方法:在bat脚本中,我们可以将命令的输出和退出码都捕获,并输出到标准输出,然后在Jenkins中解析。但这样可能比较复杂。推荐做法:如果只需要退出码,使用`returnStatus:true`。如果需要同时捕获输出和退出码,可以考虑:-在bat脚本中,将命令的标准输出重定向到一个文件,然后单独输出退出码(例如,最后一行输出退出码),然后在Jenkins中读取文件并解析退出码。-或者,分两步:第一步用returnStdout捕获输出,第二步用returnStatus捕获退出码(但要注意,同一个命令执行两次可能结果不同)。更常见的做法是:如果关心输出,就用returnStdout捕获输出,然后通过检查errorlevel变量(在bat脚本中)来设置退出码,但这样需要将整个脚本写在一个bat调用中,并在脚本内部处理错误。考虑到用户的需求是“执行命令并捕获返回值”,我们假设用户主要关心退出码。因此,最简单的示例:在Jenkinspipeline中:```groovydefexitCode=bat(script:'some_command',returnStatus:true)echo"Exitcode:${exitCode}"```如果命令是`some_command`,那么执行后,exitCode就是该命令的退出码。但是,如果用户需要在一个bat脚本文件中执行多个命令,并返回最后一个命令的退出码,那么可以这样写bat脚本:```batchsome_command1some_command2exit/b%errorlevel%```然后调用:```groovydefexitCode=bat(script:'callyour_script.bat',returnStatus:true)```注意:使用`call`是为了确保在同一个shell中执行脚本,这样退出码才能传递。另外,如果命令路径包含空格,需要使用引号。总结:用户的问题是在Jenkins中通过bat脚本执行命令并获取返回值(退出码),我们使用bat步骤的`returnStatus:true`参数来获取退出码。因此,回答如下:</think>### 在 Jenkins 中通过 bat 脚本执行命令并捕获返回值 在 Jenkins 中通过批处理脚本(.bat)执行命令并捕获返回值,可通过以下两种方式实现: --- #### **方法 1:直接通过 `bat` 步骤捕获退出码** 在 Jenkins Pipeline 中使用 `returnStatus: true` 参数捕获命令的退出码: ```groovy pipeline { agent any stages { stage('Execute Command') { steps { script { // 执行命令并捕获退出码(0=成功,非0=失败) def exitCode = bat(script: 'your_command.exe', returnStatus: true) // 使用返回值 echo "Exit Code: ${exitCode}" if (exitCode != 0) { error("Command failed with code ${exitCode}") } } } } } } ``` --- #### **方法 2:通过脚本输出捕获返回值** 在批处理脚本中显式输出返回值,并通过 `returnStdout: true` 捕获: 1. **批处理脚本**(`command_wrapper.bat`): ```batch @echo off your_command.exe echo EXIT_CODE=%errorlevel% ``` 2. **Jenkins Pipeline 解析输出**: ```groovy def output = bat(script: 'call command_wrapper.bat', returnStdout: true).trim() def exitCode = output.split("EXIT_CODE=")[1] as Integer echo "Captured Exit Code: ${exitCode}" ``` --- #### **关键说明** 1. **`errorlevel` 变量** Windows 批处理使用 `%errorlevel%` 存储上一条命令的退出码(0=成功)。 2. **`returnStatus` vs `returnStdout`** - `returnStatus: true` → 直接返回整数退出码 - `returnStdout: true` → 返回命令输出的文本 3. **路径空格处理** 若命令路径含空格,需用双引号包裹: ```groovy bat(script: '"C:\\Program Files\\tool.exe" arg1', ...) ``` 4. **错误处理** 默认情况下,非零退出码会中止 Pipeline。使用 `returnStatus` 可避免此行为。 [^1] --- ### 相关问题 1. 如何在 Jenkins 中捕获批处理脚本的标准输出(stdout)? 2. 当 Jenkins 执行 bat 脚本失败时,如何自动重试? 3. 如何通过 Jenkins Pipeline 传递参数给 bat 脚本? 4. 在 Windows 批处理中,`%errorlevel%` 和 `||`/`&&` 运算符有何区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值