簡體   English   中英

批處理腳本中的內部延遲擴展(Windows)

[英]Inner delayed expansion in a batch script (windows)

我需要在延遲擴展中進行延遲擴展,例如:

!PARAMS[!BEFORE_LAST!]!

當然,以上是無效的,所以我嘗試用 for-loop 解決它,但沒有成功:

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

我怎樣才能實現所解釋的行為?

delayed expansion里面的delayed expansion不起作用,試試這個:

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

這不是一個答案,但是使用@Enduro 的答案,我解決了我的問題。 我只是在這里舉個例子,看看如何使用它。

這個答案是唯一對我有用的答案! 經過大量搜索; 基本上我試圖生成一個包含所有 android 應用程序包名稱的文件,沒有版本代碼。 我們也使用 gradle 腳本以特定格式生成名稱,例如: com.package.appname-releaseVersion.apk

這是用於生成具有所需包名的文件(apps.ls)的原始代碼,我主要是這樣使用的,在 android shell 中: for app in $(cat < apps.ls ); do monkey -p $app 1; done; 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 expansion里面的delayed expansion不起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM