Как увеличить значение переменной int данного файла на 1 пакетный скрипт - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно увеличивать значение int переменная versionCode на 1 каждый раз, когда я запускаю пакетный скрипт .

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="com.sisapp.in.globalthesc" android:versionName="2.5" android:versionCode="8">
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
    <supports-screens android:resizeable="true"  android:largeScreens="true"/>
    <application android:icon="@drawable/sisIconLaunch">        
        <receiver android:name=".DeviceBootReceiver" />
    </application>
</manifest>

Этот код, который я использую, возвращает versionCode к 1, а если 1, то ничто не увеличивается.

@echo off
setlocal enabledelayedexpansion
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"

    for /f tokens^=10^delims^=^" %%i in ('type "%inputfile%" ^| findstr "android:versionCode"') do set vers=%%i
    for /f "tokens=1,2 delims=." %%i in ("!vers!") do (
         set decia=%%i

        set /a decia+=1    
        set newver=!decia!
    )
    for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
         set "str=%%a"
         call set "str=%%str:*]=%%"
         if "!str:~0,15!" == "<manifest xmlns" set "str=!str:%vers%=%newver%!"
         >>%inputfile% echo(!str!
  )

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Как вам сказали в предыдущем вопросе, лучше обрабатывайте XML-файлы с помощью XML-инструментов.

Пакет не подходит для этой задачи. OTOH PowerShell имеет значение и может использоваться в качестве инструмента из пакета и не имеет проблем с кодировкой UTF8.

Powershell

$File = 'D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml'
$xml = New-Object XML
$xml.Load($File)
$xml.manifest.Versioncode = [string]([int]$xml.manifest.Versioncode +1)
$xml.manifest.VersionName = [string]([double]$xml.manifest.VersionName +.1)
$xml.Save($File)

Чтобы быть в теме, упакованной в пакет:

@echo off
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"
powershell -NoP -NoLogo -C "$File='%inputfile%';$xml = New-Object XML;$xml.Load($File);$xml.manifest.Versioncode = [string]([int]$xml.manifest.Versioncode +1);$xml.manifest.VersionName = [string]([double]$xml.manifest.VersionName +.1);$xml.Save($File)"

Другим менее желательным решением является использование RegEx (здесь с обходными путями) PowerShell

$File = 'D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml'
$RE1 = '(?<=android:versionCode=")\d+(?=")'
$RE2 = '(?<=android:versionName=")[\d.]+(?=")'
$NewCode =    [int](Select-String -Path $File -Pattern $RE1 ).Matches.Value +1
$NewName = [double](Select-String -Path $File -Pattern $RE2 ).Matches.Value +.1
(Get-Content $File -Encoding UTF8 -Raw) -Replace $RE1,$NewCode -Replace $RE2,$NewName| 
 Set-Content $File -Encoding UTF8

Точно так же он может быть упакован в пакетный файл.

2 голосов
/ 27 марта 2019

Как четко указано в предыдущем вопросе, пакет не лучший инструмент для этого, и если формат xml изменяется каким-либо образом, особенно в строке <manifest, он не будет работать. Таким образом, независимо от того, вот комбинированный сценарий (предыдущий вопрос) и этот. Попробуйте и дайте мне знать.

@echo off
setlocal enabledelayedexpansion
set "inputfile=D:\Arvind.ch\SIS\SIS_Product\SIS-Global-Dev\edTheSIS\AppIcons\Global\MenifestFile\AndroidManifest.xml"

for /f tokens^=8^,10delims^=^" %%i in ('type "%inputfile%" ^| findstr "android:versionName"') do (
    set vers=%%i
    set code=%%j
)
for /f "tokens=1,2 delims=." %%i in ("!vers!") do (
     set decia=%%i
     set decib=%%j
     if "!decib!" lss "9" (
            set /a decib+=1
      ) else (
            set decib=0
            set /a decia+=1
    )
    set newver=!decia!.!decib!
)
for /f "tokens=1" %%i in ("!code!") do (
     set cnt=%%i
     set /a cnt+=1
)
set newcode=!cnt!
for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
     set "str=%%a"
     call set "str=%%str:*]=%%"
     if "!str:~0,15!" == "<manifest xmlns" set "str=!str:"%vers%"="%newver%"!"
     if "!str:~0,15!" == "<manifest xmlns" set "str=!str:"%code%"="%newcode%"!"
     >>%inputfile% echo(!str!
)

Причины возникновения проблем заключались в том, что вы смешали имена переменных из старого кода и нового. Это установит значение от одного к следующему, а также потому, что мы выполняем одинаковые поиски по всему сценарию, старые вещи будут обновляться новыми, поэтому, опять же, это не лучшее решение, powershell был бы лучшим. Но я включил в замену несколько двойных кавычек, чтобы попытаться быть более конкретным, но это не идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...