bat 脚本记录


echo decompress ETC
set export=%~dp0export\
@set x=0;
@dir *.pkmlz /a /b /s >A.txt
@for /f %%a in (A.txt) do @(set /A x=x+1)
@for /f %%f in (A.txt) do (
    echo 完整路径: %%f
    echo 所在目录: %%~dpf
    echo 文件名称无后缀: %%~nf
    echo 文件后缀名: %%~xf
    echo 完整文件名:%%~nxf
    echo 无后缀路径: %%~dpnf

   7z.exe x %%f -o%export% -y
    ping -n 1 127.0.0.1
    etc1tool.exe --decode %export%%%~nf)

<think>我们正在处理一个关于在bat脚本记录call程序返回值的问题。根据引用和之前的知识,bat脚本中调用其他程序(或函数)后,通常使用`errorlevel`来获取返回状态(通常是整数)。但是,用户可能想要获取的是程序输出的字符串返回值(比如从另一个脚本输出的结果),而不仅仅是退出代码。 引用[3]提到了从Python脚本获取输出到批处理文件的变量中,这暗示了我们需要捕获外部程序的标准输出(stdout)并赋值给变量。 因此,我们需要区分两种情况: 1. 获取被调用程序的退出代码(errorlevel) 2. 获取被调用程序输出的字符串(stdout) 根据用户的问题“记录call程序返回值”,可能两者都需要考虑,但通常“返回值”在bat中指的是errorlevel,而用户可能更关心的是输出的字符串(因为引用了Python脚本返回字符串的问题)。所以,我们需要提供两种方法。 方法一:获取退出代码(errorlevel) 在bat中,调用一个程序或函数后,其退出代码存储在`%errorlevel%`中。我们可以直接记录它。 方法二:获取标准输出(stdout) 要捕获一个命令的输出,我们可以使用for /f循环。例如,如果我们调用一个程序,它输出一些字符串,我们可以这样捕获: for /f "delims=" %%a in ('command') do set "output=%%a" 但是注意,如果输出有多行,这样只会捕获最后一行。如果需要全部输出,可能需要使用临时文件或者逐行处理。 根据引用[2],他们使用了for /f循环来捕获wmic命令的输出,并且使用了`usebackq`和`skip`等选项,但基本结构相同。 另外,引用[1]中展示了调用函数(call :func),在函数中如何返回?通常,函数可以通过设置全局变量来返回字符串,或者通过errorlevel返回整数(使用exit /b 值)。 因此,我们需要根据用户想要调用的“程序”类型来提供不同的方法。 考虑到用户的问题没有明确是外部程序还是内部函数,我们将分别说明。 步骤: 1. 如果是调用外部程序(如.exe,或Python脚本)并获取其输出字符串: 使用for /f循环捕获输出。 2. 如果是调用外部程序并获取其退出代码: 使用%errorlevel%。 3. 如果是调用内部函数(label)并获取返回值: 函数内部可以使用exit /b <value>来设置退出代码,然后调用者使用%errorlevel%获取。 或者,函数内部设置全局变量。 4. 对于内部函数返回字符串,通常只能通过设置全局变量,因为exit /b只能返回整数。 但是,用户的问题中提到了“call程序”,可能是指call命令调用的程序(外部)或者函数(内部)。所以,我们将覆盖两种情况。 示例: 获取外部程序的退出代码: myprogram.exe set exit_code=%errorlevel% echo 退出代码: %exit_code% 获取外部程序的输出: for /f "delims=" %%a in ('myprogram.exe') do set "output=%%a" echo 输出: %output% 注意:如果输出多行,上述只保留最后一行。要捕获多行,可以: setlocal enabledelayedexpansion set "output=" for /f "delims=" %%a in ('myprogram.exe') do ( set "output=!output!%%a\n" ) echo 输出: !output! 或者更简单的方法是将输出重定向到文件,然后读取文件。 调用内部函数并获取退出代码: call :myfunc set ret=%errorlevel% ... :myfunc ... do something exit /b 123 调用内部函数并获取字符串返回值(通过变量): call :myfunc result echo %result% ... :myfunc set "%~1=返回值字符串" exit /b 由于用户没有明确返回值的类型,我们将提供多种情况下的方法。 因此,回答将包括: 1. 获取外部程序退出代码 2. 获取外部程序输出(单行/多行) 3. 获取函数退出代码 4. 获取函数字符串返回值(通过变量) 注意:在bat中,函数通常是通过标签定义的,并且使用call :label来调用,函数内部使用exit /b返回退出代码。而字符串返回值通常通过将变量名作为参数传递给函数,然后在函数内部设置该变量。 根据引用[3],从Python脚本获取返回值(字符串)的方法,我们可以给出一个具体的例子。 示例代码: 1. 获取Python脚本的输出(假设脚本输出一行字符串): @echo off for /f "delims=" %%a in ('python myscript.py') do set "output=%%a" echo 输出: %output% 2. 如果Python脚本输出多行,并且我们想要全部内容,可以使用临时文件: @echo off python myscript.py > temp.txt set /p output=<temp.txt :: 这样只能读取第一行 del temp.txt 但是读取整个文件内容(多行)在bat中比较麻烦,可以使用如下循环: setlocal enabledelayedexpansion set "output=" for /f "delims=" %%a in ('python myscript.py') do ( set "output=!output!%%a\n" ) echo !output! 但是这样会在每行后面加上\n(换行符),而bat中echo会自动换行。如果希望保持原格式,另一种方法是直接重定向输出到文件,然后逐行处理或直接显示文件内容。 考虑到用户可能只需要退出代码,也可能需要输出,我们分别说明。 最后,我们还要注意,如果调用程序时出现错误(比如找不到文件),errorlevel会非0,我们可以检查。 因此,综合以上,给出回答。 </think> 在批处理脚本中,记录 `call` 程序(包括外部程序或内部函数)的返回值,主要通过两种方式实现:**获取退出代码(整数)** 或 **捕获标准输出(字符串)**。以下是具体方法: --- ### 一、获取退出代码(%errorlevel%) 退出代码是一个整数值(通常 `0` 表示成功,非 `0` 表示错误),通过 `%errorlevel%` 系统变量获取: ```batch @echo off chcp 65001 > nul :: 调用程序或函数 call :my_function set exit_code=%errorlevel% echo 函数退出代码:%exit_code% :: 调用外部程序 notepad.exe set notepad_exit=%errorlevel% echo Notepad退出代码:%notepad_exit% exit /b :my_function echo 执行函数... exit /b 42 :: 返回自定义退出代码 ``` **说明**: 1. `exit /b <value>` 在函数中设置退出代码(如 `exit /b 42`)。 2. 调用后立即用 `%errorlevel%` 记录值(避免被后续命令覆盖)[^1]。 --- ### 二、捕获标准输出(字符串) 若需获取程序输出的文本(如 Python 脚本的 `print` 结果),使用 `for /f` 循环: ```batch @echo off chcp 65001 > nul :: 捕获单行输出 for /f "delims=" %%a in ('python -c "print('Hello Bat')"') do ( set output=%%a ) echo Python 输出:%output% :: 捕获多行输出(保存到变量) setlocal enabledelayedexpansion set "multi_line=" for /f "delims=" %%b in ('python -c "print('Line1\nLine2')"') do ( set "multi_line=!multi_line!%%b\n" ) echo 多行输出:!multi_line! ``` **说明**: 1. `for /f "delims="` 逐行读取命令输出,`delims=` 禁止拆分文本。 2. 多行内容需用 `enabledelayedexpansion` 和 `!var!` 动态拼接[^2][^3]。 --- ### 三、函数返回字符串(通过参数传递) 批处理函数无法直接返回字符串,可通过变量名参数间接传值: ```batch @echo off chcp 65001 > nul call :get_message result :: 传递变量名 echo 函数返回:%result% exit /b :get_message set "%~1=Hello from function" :: %~1接收变量名并赋值 exit /b 0 ``` --- ### 注意事项 1. **作用域问题**:函数内使用 `setlocal` 会创建局部变量,需用 `endlocal` 和全局变量传递结果。 2. **错误处理**:检查 `%errorlevel%` 非零时执行错误处理逻辑。 3. **多行输出**:复杂内容建议重定向到临时文件(如 `program.exe > temp.txt`),再读取文件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值