批处理脚本中的内部延迟扩展(窗口)

时间:2013-08-29 06:42:24

标签: windows batch-file delayedvariableexpansion

我需要在延迟扩展中进行延迟扩展,即如:

!PARAMS[!BEFORE_LAST!]!

当然,上面的内容无效,所以我尝试用for循环解决它,但没有成功:

SETLOCAL EnableExtensions EnableDelayedExpansion

SET PARAM_COUNT=0
FOR %%P IN (%*) DO (
    SET /A PARAM_COUNT+=1
    SET PARAMS[!PARAM_COUNT!]=%%P

    IF !PARAM_COUNT! GTR 1 (
        SET /A BEFORE_LAST = !PARAM_COUNT!-1
        FOR /L %%G IN (!BEFORE_LAST!) DO SET BEFORE_LAST_PARAM=!PARAMS[%%G]!
        IF "!BEFORE_LAST_PARAM!"=="--buildroot" (
            REM perfrom some actions here
        )
    )
)
ENDLOCAL

我怎样才能达到解释的行为?

2 个答案:

答案 0 :(得分:1)

delayed expansion内的{p> delayed expansion不起作用,请尝试以下操作:

CALL SET "myvar=%%PARAMS[!BEFORE_LAST!]%%"

答案 1 :(得分:0)

这不是一个很好的答案,但是使用@Enduro 的答案,我解决了我的问题。我这里只是举个例子,看看怎么用。

这个答案是唯一对我有用的答案!经过大量搜索;基本上我试图生成一个包含所有 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 效果非常好。我也找不到关于此的任何文档,因为甚至很难搜索此问题。我注意到的是 call echo %%name:~0,!!idx!!%% 打印正确,而 echo %%name:~0,!!idx!!%% 打印的内容类似于 name:~0,28 并且不工作。当时我无法理解,但今天我可以从@Endoro 的回答中了解到

<块引用>

delayed expansiondelayed expansion 不起作用