这不是一个答案,但使用@Enduro's Answer,我解决了我的问题。我这里只是举个例子,看看怎么用。
这个答案是唯一对我有用的答案!经过大量搜索;基本上我试图生成一个包含所有 android 应用程序包名称的文件,没有版本代码。我们还使用 gradle 脚本来生成特定格式的名称,例如: com.package.appname-releaseVersion.apk
.
这是生成具有所需包名称的文件(apps.ls)的原始代码,我主要在android shell中使用它for app in $(cat < apps.ls ); do monkey -p $app 1; done;
:它只是启动所有这些应用程序以确保它们的服务开始运行和注册。
我的原创剧本
@echo off
setlocal EnableDelayedExpansion
cd "C:\remoteUpdate"
>apps.ls (
for /r %%v in (*.apk) do (
set "name=%%~nv"
call :indexof "!name!" "-" idx
call echo %%name:~0,!!idx!!%%
)
)
C:\dos2unix\bin\dos2unix.exe apps.ls
@echo Done generating apps.ls
:indexof [%1 - string ; %2 - find index of ; %3 - if defined will store the result in variable with same name]
::http://ss64.org/viewtopic.php?id=1687
@echo off
setlocal enableDelayedExpansion
set "str=%~1"
set "s=!str:%~2=&rem.!"
set s=#%s%
if "%s%" equ "#%~1" endlocal& if "%~3" neq "" (set %~3=-1&exit /b 0) else (echo -1&exit /b 0)
set "len=0"
for %%A in (2187 729 243 81 27 9 3 1) do (
set /A mod=2*%%A
for %%Z in (!mod!) do (
if "!s:~%%Z,1!" neq "" (
set /a "len+=%%Z"
set "s=!s:~%%Z!"
) else (
if "!s:~%%A,1!" neq "" (
set /a "len+=%%A"
set "s=!s:~%%A!"
)
)
)
)
endlocal & if "%~3" neq "" (set %~3=%len%)
exit /b 0
apps.ls
现在的问题是我需要从我的文件中过滤掉某些包,
变化
我需要做的就是更改 for 循环中的代码,如下所示:
CALL SET "truncname=%%name:~0,!!idx!!%%"
if NOT "!truncname!"=="com.blhealthcare.package1" if NOT "!truncname!"=="com.android.package2" echo !truncname!
在那之前我尝试过的一切,只使用set都行不通。然而,使用 set 调用效果非常好。我也找不到任何有关此问题的文档,因为甚至很难搜索此问题。我注意到的call echo %%name:~0,!!idx!!%%
是打印正确,而echo %%name:~0,!!idx!!%%
打印的东西类似name:~0,28
但不工作。那时我无法理解,但今天我可以从@Endoro 的回答中理解
delayed expansion
内部delayed expansion
不起作用