批处理中for语句中的变量在执行外部程序后会自动变成空值呢?

批处理中for语句中的变量在执行外部程序后会自动变成空值呢?

color 20
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('dir /b') do (
if %%~xa==.apk (
rem 如果是apk文件才处理批处理中for语句中的变量在执行外部程序后会自动变成空值呢? rem fileName-src
set apkFileName=%%~nxa
set sourceFileName=!apkFileName:.apk=-src!
set unzipApkfilePath=!apkFileName:.apk=!
rem 使用APKTool反编译得到资源文件和smali格式源码
"E:\Android\Android Decompile\Ter-dex2jar.jd-gui\apktool\apktool.bat" d -f %~dp0!apkFileName! %~dp0!sourceFileName!
set apkFileName=%%~nxa
set sourceFileName=!apkFileName:.apk=-src!
set unzipApkfilePath=!apkFileName:.apk=!
echo !apkFileName!
echo !sourceFileName!
echo !unzipApkfilePath!
set
就是在这一步出错!!变量变成空值!!
完整代码-补充:因为代码不能卸载一次补充里
"C:\Program Files (x86)\WinRAR\WinRAR.exe" X %~dp0!apkFileName! %~dp0!unzipApkfilePath!\
rem 使用dex2jar得到Jar文件

"E:\Android\Android
Decompile\Ter-dex2jar.jd-gui\dex2jar-0.0.9.15\d2j-dex2jar.bat"
%~dp0!unzipApkfilePath!\classes.dex -o %~dp0!sourceFileName!\src.jar
)
)

非常赞成 陌生时空 和 xxpinqz 两位网友的回答,补充一点:
"E:\Android\Android Decompile\Ter-dex2jar.jd-gui\apktool\apktool.bat" d -f %~dp0!apkFileName! %~dp0!sourceFileName!
此句 前面应该加个call 估计也是出现问题关键所在
此句看起来很长,其实就是 xx.bat 几个参数 的结构,批处理中调用另一批处理必须带call调用,否则返回不了,而调用windows很多窗口程序前面要带start调用也有类似道理,不过一个是等待被调用批处理结束后返回, 一个是不要等(除非start带/wait)start调用的结束就继续执行批处理后续命令
所以应该不是所说的那个位置变量值变成空了,而是另一批处理(包括它再调用的程序)出了问题而被误会,这个很容易检测,在此句之下加句检测命令 echo 返回否?&pause 甚至临时加上适当右括号使前面的括号匹配成对,写批处理要会自己检测错误,此句前设个检测点没问题,此句后检测就有问题了,当然就是这一句问题了。可以说,根据代码用途只要此句能返回,是不会出现所说的变量值变空的。
顺便提醒一下,此句调用的那个批处理是否利用了它自己的当前路径?不然此句前应改变一下当前路径比如
pushd "E:\Android\Android Decompile\Ter-dex2jar.jd-gui\apktool"
call apktool.bat d -f %~dp0!apkFileName! %~dp0!sourceFileName!
popd
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-22
任何使用到%%a的语句都应该在for语句的两个括号内部。

其实调试代码的一个不错的方法就是不断地减少代码,直到不出错为止,那么你上一次删除的代码就是有问题代码。

试试这个:
color 20
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('dir /b') do (
if %%~xa==.apk (
rem 如果是apk文件才处理批处理中for语句中的变量在执行外部程序后会自动变成空值呢? rem fileName-src
set apkFileName=%%~nxa
set sourceFileName=!apkFileName:.apk=-src!
set unzipApkfilePath=!apkFileName:.apk=!
rem 使用APKTool反编译得到资源文件和smali格式源码
"E:\Android\Android Decompile\Ter-dex2jar.jd-gui\apktool\apktool.bat" d -f %~dp0!apkFileName! %~dp0!sourceFileName!
set apkFileName=%%~nxa
set sourceFileName=!apkFileName:.apk=-src!
set unzipApkfilePath=!apkFileName:.apk=!
echo !apkFileName!
echo !sourceFileName!
echo !unzipApkfilePath!
))
第2个回答  2014-03-21
把代码发全了。。。。
或者试着把:
set sourceFileName=!apkFileName:.apk=-src!
set unzipApkfilePath=!apkFileName:.apk=!
改为:
set "sourceFileName=%%~na-src"
set "unzipApkfilePath=%%~na"
相似回答